diff options
author | Eric Snow <ericsnowcurrently@gmail.com> | 2015-05-30 18:51:15 (GMT) |
---|---|---|
committer | Eric Snow <ericsnowcurrently@gmail.com> | 2015-05-30 18:51:15 (GMT) |
commit | e3dfa9e5ce9ffc1903c57c521a707c0485e962e1 (patch) | |
tree | 77b4888011c1c0db248f34fe7afe2747b43fe64e | |
parent | d0a06455a5a56c637ccf582d99e499d45091cdbd (diff) | |
download | cpython-e3dfa9e5ce9ffc1903c57c521a707c0485e962e1.zip cpython-e3dfa9e5ce9ffc1903c57c521a707c0485e962e1.tar.gz cpython-e3dfa9e5ce9ffc1903c57c521a707c0485e962e1.tar.bz2 |
Issue #16991: Fix a few leaks and other memory-related concerns in OrderedDict.
-rw-r--r-- | Objects/odictobject.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/Objects/odictobject.c b/Objects/odictobject.c index cc6c53c..e7a368f 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -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; |