diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2008-09-05 00:03:33 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2008-09-05 00:03:33 (GMT) |
commit | d79dc6216cf062a3eb0c100f8b546bf0a867e450 (patch) | |
tree | 3b25ddd5c88c10c517c42a56e4ce0886c912847e | |
parent | 9252287f2c9bc09fdc6bc729e13ac63935e4976e (diff) | |
download | cpython-d79dc6216cf062a3eb0c100f8b546bf0a867e450.zip cpython-d79dc6216cf062a3eb0c100f8b546bf0a867e450.tar.gz cpython-d79dc6216cf062a3eb0c100f8b546bf0a867e450.tar.bz2 |
Issue #3660 (part of): fix a memory leak in _pickle.
Patch by Amaury Forgeot d'Arc, review by me.
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/_pickle.c | 6 |
2 files changed, 7 insertions, 1 deletions
@@ -80,6 +80,8 @@ C API Library ------- +- Issue #3660: fix a memory leak in the C accelerator of the pickle module. + - Issue #3160: the "bdist_wininst" distutils command didn't work. - Issue #1658: tkinter changes dict size during iteration in both diff --git a/Modules/_pickle.c b/Modules/_pickle.c index ea5bbe2..f7b5212 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -3837,13 +3837,17 @@ load_build(UnpicklerObject *self) if (setstate == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) PyErr_Clear(); - else + else { + Py_DECREF(state); return -1; + } } else { PyObject *result; /* The explicit __setstate__ is responsible for everything. */ + /* Ugh... this does not leak since unpickler_call() steals the + reference to state first. */ result = unpickler_call(self, setstate, state); Py_DECREF(setstate); if (result == NULL) |