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.)
This commit is contained in:
Guido van Rossum 2001-10-25 20:18:35 +00:00
parent b112481f12
commit a0dfc8577d
2 changed files with 14 additions and 3 deletions

View File

@ -54,6 +54,7 @@ Terrence Brannon
Dave Brennan
Gary S. Brown
Oleg Broytmann
Dave Brueck
Stan Bubrouski
Erik de Bueger
Jan-Hein B"uhrman

View File

@ -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);