Commit ea370a9e authored by Georg Brandl's avatar Georg Brandl

#6544: fix refleak in kqueue, occurring in certain error conditions.

parent 6ae19ade
...@@ -58,6 +58,9 @@ Library ...@@ -58,6 +58,9 @@ Library
Extension Modules Extension Modules
----------------- -----------------
- Issue #6544: fix a reference leak in the kqueue implementation's error
handling.
- Stop providing crtassem.h symbols when compiling with Visual Studio 2010, as - Stop providing crtassem.h symbols when compiling with Visual Studio 2010, as
msvcr100.dll is not a platform assembly anymore. msvcr100.dll is not a platform assembly anymore.
......
...@@ -1236,6 +1236,7 @@ static struct PyMemberDef kqueue_event_members[] = { ...@@ -1236,6 +1236,7 @@ static struct PyMemberDef kqueue_event_members[] = {
#undef KQ_OFF #undef KQ_OFF
static PyObject * static PyObject *
kqueue_event_repr(kqueue_event_Object *s) kqueue_event_repr(kqueue_event_Object *s)
{ {
char buf[1024]; char buf[1024];
...@@ -1521,19 +1522,6 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) ...@@ -1521,19 +1522,6 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
return NULL; return NULL;
} }
if (ch != NULL && ch != Py_None) {
it = PyObject_GetIter(ch);
if (it == NULL) {
PyErr_SetString(PyExc_TypeError,
"changelist is not iterable");
return NULL;
}
nchanges = PyObject_Size(ch);
if (nchanges < 0) {
return NULL;
}
}
if (otimeout == Py_None || otimeout == NULL) { if (otimeout == Py_None || otimeout == NULL) {
ptimeoutspec = NULL; ptimeoutspec = NULL;
} }
...@@ -1569,11 +1557,22 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) ...@@ -1569,11 +1557,22 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
return NULL; return NULL;
} }
if (nchanges) { if (ch != NULL && ch != Py_None) {
it = PyObject_GetIter(ch);
if (it == NULL) {
PyErr_SetString(PyExc_TypeError,
"changelist is not iterable");
return NULL;
}
nchanges = PyObject_Size(ch);
if (nchanges < 0) {
goto error;
}
chl = PyMem_New(struct kevent, nchanges); chl = PyMem_New(struct kevent, nchanges);
if (chl == NULL) { if (chl == NULL) {
PyErr_NoMemory(); PyErr_NoMemory();
return NULL; goto error;
} }
i = 0; i = 0;
while ((ei = PyIter_Next(it)) != NULL) { while ((ei = PyIter_Next(it)) != NULL) {
...@@ -1596,7 +1595,7 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) ...@@ -1596,7 +1595,7 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
evl = PyMem_New(struct kevent, nevents); evl = PyMem_New(struct kevent, nevents);
if (evl == NULL) { if (evl == NULL) {
PyErr_NoMemory(); PyErr_NoMemory();
return NULL; goto error;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment