Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c1822a4

Browse filesBrowse files
committed
changes by Steve Clift
1 parent 7d0590b commit c1822a4
Copy full SHA for c1822a4

File tree

Expand file treeCollapse file tree

1 file changed

+92
-80
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+92
-80
lines changed

‎Modules/syslogmodule.c

Copy file name to clipboardExpand all lines: Modules/syslogmodule.c
+92-80Lines changed: 92 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2222
2323
******************************************************************/
2424

25+
/******************************************************************
26+
27+
Revision history:
28+
29+
95/06/29 (Steve Clift)
30+
- Changed arg parsing to use PyArg_ParseTuple.
31+
- Added PyErr_Clear() call(s) where needed.
32+
- Fix core dumps if user message contains format specifiers.
33+
- Change openlog arg defaults to match normal syslog behaviour.
34+
- Plug memory leak in openlog().
35+
- Fix setlogmask() to return previous mask value.
36+
37+
******************************************************************/
38+
2539
/* syslog module */
2640

2741
#include "Python.h"
@@ -33,18 +47,21 @@ syslog_openlog(self, args)
3347
PyObject * self;
3448
PyObject * args;
3549
{
36-
char *ident = "";
37-
PyObject * ident_o;
38-
long logopt = LOG_PID;
50+
long logopt = 0;
3951
long facility = LOG_USER;
40-
if (!PyArg_Parse(args, "(Sll);ident string, logoption, facility", &ident_o, &logopt, &facility))
41-
if (!PyArg_Parse(args, "(Sl);ident string, logoption", &ident_o, &logopt))
42-
if (!PyArg_Parse(args, "S;ident string", &ident_o))
52+
53+
static PyObject *ident_o = NULL;
54+
55+
Py_XDECREF(ident_o);
56+
if (!PyArg_ParseTuple(args, "S|ll;ident string [, logoption [, facility]]",
57+
&ident_o, &logopt, &facility)) {
4358
return NULL;
59+
}
4460
Py_INCREF(ident_o); /* This is needed because openlog() does NOT make a copy
45-
and syslog() later uses it.. cannot trash it. */
46-
ident = PyString_AsString(ident_o);
47-
openlog(ident,logopt,facility);
61+
and syslog() later uses it.. cannot trash it. */
62+
63+
openlog(PyString_AsString(ident_o), logopt, facility);
64+
4865
Py_INCREF(Py_None);
4966
return Py_None;
5067
}
@@ -54,13 +71,17 @@ syslog_syslog(self, args)
5471
PyObject * self;
5572
PyObject * args;
5673
{
57-
int priority = LOG_INFO;
58-
char *message;
74+
char *message, *s;
75+
int priority = LOG_INFO | LOG_USER;
5976

60-
if (!PyArg_Parse(args,"(is);priority, message string",&priority,&message))
61-
if (!PyArg_Parse(args,"s;message string",&message))
77+
if (!PyArg_ParseTuple(args, "is;[priority,] message string",
78+
&priority, &message)) {
79+
PyErr_Clear();
80+
if (!PyArg_ParseTuple(args, "s;[priority,] message string", &message)) {
6281
return NULL;
63-
syslog(priority, message);
82+
}
83+
}
84+
syslog(priority, "%s", message);
6485
Py_INCREF(Py_None);
6586
return Py_None;
6687
}
@@ -70,7 +91,7 @@ syslog_closelog(self, args)
7091
PyObject * self;
7192
PyObject * args;
7293
{
73-
if (!PyArg_NoArgs(args))
94+
if (!PyArg_ParseTuple(args, ""))
7495
return NULL;
7596
closelog();
7697
Py_INCREF(Py_None);
@@ -82,12 +103,12 @@ syslog_setlogmask(self, args)
82103
PyObject * self;
83104
PyObject * args;
84105
{
85-
long maskpri;
86-
if (!PyArg_Parse(args,"l;mask for priority",&maskpri))
106+
long maskpri, omaskpri;
107+
108+
if (!PyArg_ParseTuple(args,"l;mask for priority",&maskpri))
87109
return NULL;
88-
setlogmask(maskpri);
89-
Py_INCREF(Py_None);
90-
return Py_None;
110+
omaskpri = setlogmask(maskpri);
111+
return PyInt_FromLong(omaskpri);
91112
}
92113

93114
static PyObject *
@@ -97,7 +118,7 @@ syslog_log_mask(self, args)
97118
{
98119
long mask;
99120
long pri;
100-
if (!PyArg_Parse(args,"l",&pri))
121+
if (!PyArg_ParseTuple(args,"l",&pri))
101122
return NULL;
102123
mask = LOG_MASK(pri);
103124
return PyInt_FromLong(mask);
@@ -110,7 +131,7 @@ syslog_log_upto(self, args)
110131
{
111132
long mask;
112133
long pri;
113-
if (!PyArg_Parse(args,"l",&pri))
134+
if (!PyArg_ParseTuple(args,"l",&pri))
114135
return NULL;
115136
mask = LOG_UPTO(pri);
116137
return PyInt_FromLong(mask);
@@ -119,77 +140,68 @@ syslog_log_upto(self, args)
119140
/* List of functions defined in the module */
120141

121142
static PyMethodDef syslog_methods[] = {
122-
{"openlog", (PyCFunction)syslog_openlog},
123-
{"closelog", (PyCFunction)syslog_closelog},
124-
{"syslog", (PyCFunction)syslog_syslog},
125-
{"setlogmask", (PyCFunction)syslog_setlogmask},
126-
{"LOG_MASK", (PyCFunction)syslog_log_mask},
127-
{"LOG_UPTO", (PyCFunction)syslog_log_upto},
128-
{NULL, NULL} /* sentinel */
143+
{"openlog", syslog_openlog, METH_VARARGS},
144+
{"closelog", syslog_closelog, METH_VARARGS},
145+
{"syslog", syslog_syslog, METH_VARARGS},
146+
{"setlogmask", syslog_setlogmask, METH_VARARGS},
147+
{"LOG_MASK", syslog_log_mask, METH_VARARGS},
148+
{"LOG_UPTO", syslog_log_upto, METH_VARARGS},
149+
{NULL, NULL, 0}
129150
};
130151

131152
/* Initialization function for the module */
132153

154+
#define DICT_SET_INT(d, s, x) \
155+
PyDict_SetItemString(d, s, PyInt_FromLong((long) (x)))
156+
133157
void
134158
initsyslog()
135159
{
136-
PyObject *m, *d, *x;
160+
PyObject *m, *d;
137161

138162
/* Create the module and add the functions */
139163
m = Py_InitModule("syslog", syslog_methods);
140164

141165
/* Add some symbolic constants to the module */
142166
d = PyModule_GetDict(m);
143-
x = PyInt_FromLong(LOG_EMERG);
144-
PyDict_SetItemString(d, "LOG_EMERG", x);
145-
x = PyInt_FromLong(LOG_ALERT);
146-
PyDict_SetItemString(d, "LOG_ALERT", x);
147-
x = PyInt_FromLong(LOG_CRIT);
148-
PyDict_SetItemString(d, "LOG_CRIT", x);
149-
x = PyInt_FromLong(LOG_ERR);
150-
PyDict_SetItemString(d, "LOG_ERR", x);
151-
x = PyInt_FromLong(LOG_WARNING);
152-
PyDict_SetItemString(d, "LOG_WARNING", x);
153-
x = PyInt_FromLong(LOG_NOTICE);
154-
PyDict_SetItemString(d, "LOG_NOTICE", x);
155-
x = PyInt_FromLong(LOG_INFO);
156-
PyDict_SetItemString(d, "LOG_INFO", x);
157-
x = PyInt_FromLong(LOG_DEBUG);
158-
PyDict_SetItemString(d, "LOG_DEBUG", x);
159-
x = PyInt_FromLong(LOG_PID);
160-
PyDict_SetItemString(d, "LOG_PID", x);
161-
x = PyInt_FromLong(LOG_CONS);
162-
PyDict_SetItemString(d, "LOG_CONS", x);
163-
x = PyInt_FromLong(LOG_NDELAY);
164-
PyDict_SetItemString(d, "LOG_NDELAY", x);
165-
x = PyInt_FromLong(LOG_NOWAIT);
166-
PyDict_SetItemString(d, "LOG_NOWAIT", x);
167-
x = PyInt_FromLong(LOG_KERN);
168-
PyDict_SetItemString(d, "LOG_KERN", x);
169-
x = PyInt_FromLong(LOG_USER);
170-
PyDict_SetItemString(d, "LOG_USER", x);
171-
x = PyInt_FromLong(LOG_MAIL);
172-
PyDict_SetItemString(d, "LOG_MAIL", x);
173-
x = PyInt_FromLong(LOG_DAEMON);
174-
PyDict_SetItemString(d, "LOG_DAEMON", x);
175-
x = PyInt_FromLong(LOG_LPR);
176-
PyDict_SetItemString(d, "LOG_LPR", x);
177-
x = PyInt_FromLong(LOG_LOCAL0);
178-
PyDict_SetItemString(d, "LOG_LOCAL0", x);
179-
x = PyInt_FromLong(LOG_LOCAL1);
180-
PyDict_SetItemString(d, "LOG_LOCAL1", x);
181-
x = PyInt_FromLong(LOG_LOCAL2);
182-
PyDict_SetItemString(d, "LOG_LOCAL2", x);
183-
x = PyInt_FromLong(LOG_LOCAL3);
184-
PyDict_SetItemString(d, "LOG_LOCAL3", x);
185-
x = PyInt_FromLong(LOG_LOCAL4);
186-
PyDict_SetItemString(d, "LOG_LOCAL4", x);
187-
x = PyInt_FromLong(LOG_LOCAL5);
188-
PyDict_SetItemString(d, "LOG_LOCAL5", x);
189-
x = PyInt_FromLong(LOG_LOCAL6);
190-
PyDict_SetItemString(d, "LOG_LOCAL6", x);
191-
x = PyInt_FromLong(LOG_LOCAL7);
192-
PyDict_SetItemString(d, "LOG_LOCAL7", x);
167+
168+
/* Priorities */
169+
DICT_SET_INT(d, "LOG_EMERG", LOG_EMERG);
170+
DICT_SET_INT(d, "LOG_ALERT", LOG_ALERT);
171+
DICT_SET_INT(d, "LOG_CRIT", LOG_CRIT);
172+
DICT_SET_INT(d, "LOG_ERR", LOG_ERR);
173+
DICT_SET_INT(d, "LOG_WARNING", LOG_WARNING);
174+
DICT_SET_INT(d, "LOG_NOTICE", LOG_NOTICE);
175+
DICT_SET_INT(d, "LOG_INFO", LOG_INFO);
176+
DICT_SET_INT(d, "LOG_DEBUG", LOG_DEBUG);
177+
178+
/* openlog() option flags */
179+
DICT_SET_INT(d, "LOG_PID", LOG_PID);
180+
DICT_SET_INT(d, "LOG_CONS", LOG_CONS);
181+
DICT_SET_INT(d, "LOG_NDELAY", LOG_NDELAY);
182+
DICT_SET_INT(d, "LOG_NOWAIT", LOG_NOWAIT);
183+
#ifdef LOG_PERROR
184+
DICT_SET_INT(d, "LOG_PERROR", LOG_PERROR);
185+
#endif
186+
187+
/* Facilities */
188+
DICT_SET_INT(d, "LOG_KERN", LOG_KERN);
189+
DICT_SET_INT(d, "LOG_USER", LOG_USER);
190+
DICT_SET_INT(d, "LOG_MAIL", LOG_MAIL);
191+
DICT_SET_INT(d, "LOG_DAEMON", LOG_DAEMON);
192+
DICT_SET_INT(d, "LOG_AUTH", LOG_AUTH);
193+
DICT_SET_INT(d, "LOG_LPR", LOG_LPR);
194+
DICT_SET_INT(d, "LOG_NEWS", LOG_NEWS);
195+
DICT_SET_INT(d, "LOG_UUCP", LOG_UUCP);
196+
DICT_SET_INT(d, "LOG_CRON", LOG_CRON);
197+
DICT_SET_INT(d, "LOG_LOCAL0", LOG_LOCAL0);
198+
DICT_SET_INT(d, "LOG_LOCAL1", LOG_LOCAL1);
199+
DICT_SET_INT(d, "LOG_LOCAL2", LOG_LOCAL2);
200+
DICT_SET_INT(d, "LOG_LOCAL3", LOG_LOCAL3);
201+
DICT_SET_INT(d, "LOG_LOCAL4", LOG_LOCAL4);
202+
DICT_SET_INT(d, "LOG_LOCAL5", LOG_LOCAL5);
203+
DICT_SET_INT(d, "LOG_LOCAL6", LOG_LOCAL6);
204+
DICT_SET_INT(d, "LOG_LOCAL7", LOG_LOCAL7);
193205

194206
/* Check for errors */
195207
if (PyErr_Occurred())

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.