From: Anthony Baxter Date: Thu, 1 Nov 2001 14:43:51 +0000 (+0000) Subject: backport of 2.58: X-Git-Tag: v2.1.2c1~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8f113e915095669062c5a5c186f59b55911ec269;p=thirdparty%2FPython%2Fcpython.git backport of 2.58: Fix SF bug #474538: Memory (reference) leak in poller.register (Dave Brueck) Replace some tortuous code that was trying to be clever but forgot to DECREF the key and value, by more longwinded but obviously correct code. --- diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 412bb8d690cb..5eb4dc3dae8d 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -372,6 +372,7 @@ poll_register(pollObject *self, PyObject *args) { PyObject *o, *key, *value; int fd, events = POLLIN | POLLPRI | POLLOUT; + int err; if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) { return NULL; @@ -382,11 +383,20 @@ poll_register(pollObject *self, PyObject *args) /* Add entry to the internal dictionary: the key is the file descriptor, and the value is the event mask. */ - if ( (NULL == (key = PyInt_FromLong(fd))) || - (NULL == (value = PyInt_FromLong(events))) || - (PyDict_SetItem(self->dict, key, value)) == -1) { + key = PyInt_FromLong(fd); + if (key == NULL) + return NULL; + value = PyInt_FromLong(events); + if (value == NULL) { + Py_DECREF(key); return NULL; } + err = PyDict_SetItem(self->dict, key, value); + Py_DECREF(key); + Py_DECREF(value); + if (err < 0) + return NULL; + self->ufd_uptodate = 0; Py_INCREF(Py_None);