From a0dfc8577de8c1b6de19dccc2992b6d95b71f969 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 25 Oct 2001 20:18:35 +0000 Subject: 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. (Inspired by but not copying the fix from SF patch #475033.) --- Modules/selectmodule.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'Modules/selectmodule.c') diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index e480fb4785..348987b603 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -366,6 +366,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; @@ -376,11 +377,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); -- cgit v1.2.1