Issue #16991: Fix a few leaks and other memory-related concerns in OrderedDict.
This commit is contained in:
parent
d0a06455a5
commit
e3dfa9e5ce
|
@ -1030,8 +1030,7 @@ odict_reduce(register PyODictObject *od)
|
|||
goto Done;
|
||||
if (!ns_len) {
|
||||
/* nothing novel to pickle in od.__dict__ */
|
||||
Py_DECREF(ns);
|
||||
ns = NULL;
|
||||
Py_CLEAR(ns);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1184,8 +1183,7 @@ _odict_popkey(PyObject *od, PyObject *key, PyObject *failobj)
|
|||
value = PyObject_GetItem(od, key);
|
||||
if (value != NULL) {
|
||||
if (PyObject_DelItem(od, key) == -1) {
|
||||
Py_DECREF(value);
|
||||
value = NULL;
|
||||
Py_CLEAR(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1718,10 +1716,10 @@ odict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
{
|
||||
PyObject *od = PyDict_Type.tp_new(type, args, kwds);
|
||||
if (od != NULL) {
|
||||
((PyODictObject *)od)->od_inst_dict = PyDict_New();
|
||||
((PyODictObject *)od)->od_weakreflist = NULL;
|
||||
if (_odict_initialize((PyODictObject *)od) < 0)
|
||||
return NULL;
|
||||
((PyODictObject *)od)->od_inst_dict = PyDict_New();
|
||||
((PyODictObject *)od)->od_weakreflist = NULL;
|
||||
}
|
||||
return od;
|
||||
}
|
||||
|
@ -1845,8 +1843,7 @@ odictiter_nextkey(odictiterobject *di)
|
|||
node = _odict_find_node(di->di_odict, di->di_current);
|
||||
if (node == NULL) {
|
||||
/* Must have been deleted. */
|
||||
Py_DECREF(di->di_current);
|
||||
di->di_current = NULL;
|
||||
Py_CLEAR(di->di_current);
|
||||
return NULL;
|
||||
}
|
||||
key = di->di_current;
|
||||
|
@ -1884,8 +1881,11 @@ odictiter_iternext(odictiterobject *di)
|
|||
PyObject *result = di->di_result;
|
||||
|
||||
value = PyODict_GetItem((PyObject *)di->di_odict, key); /* borrowed */
|
||||
if (value == NULL)
|
||||
if (value == NULL) {
|
||||
Py_DECREF(key);
|
||||
return NULL;
|
||||
}
|
||||
Py_INCREF(value);
|
||||
|
||||
if (result->ob_refcnt == 1) {
|
||||
/* not in use so we can reuse it
|
||||
|
@ -1896,11 +1896,13 @@ odictiter_iternext(odictiterobject *di)
|
|||
}
|
||||
else {
|
||||
result = PyTuple_New(2);
|
||||
if (result == NULL)
|
||||
if (result == NULL) {
|
||||
Py_DECREF(key);
|
||||
Py_DECREF(value);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Py_INCREF(value);
|
||||
PyTuple_SET_ITEM(result, 0, key); /* steals reference */
|
||||
PyTuple_SET_ITEM(result, 1, value); /* steals reference */
|
||||
|
||||
|
@ -2365,7 +2367,6 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs)
|
|||
else if (PyObject_HasAttrString(other, "keys")) { /* never fails */
|
||||
PyObject *keys, *iterator, *key;
|
||||
keys = PyObject_CallMethod(other, "keys", NULL);
|
||||
Py_DECREF(other);
|
||||
if (keys == NULL)
|
||||
return NULL;
|
||||
iterator = PyObject_GetIter(keys);
|
||||
|
@ -2383,6 +2384,7 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs)
|
|||
}
|
||||
Py_DECREF(key);
|
||||
}
|
||||
Py_DECREF(other);
|
||||
Py_DECREF(iterator);
|
||||
if (res != 0 || PyErr_Occurred())
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue