diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-03-30 06:53:06 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-03-30 06:53:06 (GMT) |
commit | 07e03ab9f9452e37c0c9f7ece5e3afc00717187c (patch) | |
tree | 491984f3929b18a04736766a0d4229fb03945628 | |
parent | aa64c46ac9ff168d7730182d48665b0b51b4f69d (diff) | |
download | cpython-07e03ab9f9452e37c0c9f7ece5e3afc00717187c.zip cpython-07e03ab9f9452e37c0c9f7ece5e3afc00717187c.tar.gz cpython-07e03ab9f9452e37c0c9f7ece5e3afc00717187c.tar.bz2 |
Issue #23783: Fixed memory leak in PyObject_ClearWeakRefs() in case of
MemoryError.
-rw-r--r-- | Objects/weakrefobject.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index 871c248..e1f4bc4 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -924,11 +924,9 @@ PyObject_ClearWeakRefs(PyObject *object) if (*list != NULL) { PyWeakReference *current = *list; Py_ssize_t count = _PyWeakref_GetWeakrefCount(current); - int restore_error = PyErr_Occurred() ? 1 : 0; PyObject *err_type, *err_value, *err_tb; - if (restore_error) - PyErr_Fetch(&err_type, &err_value, &err_tb); + PyErr_Fetch(&err_type, &err_value, &err_tb); if (count == 1) { PyObject *callback = current->wr_callback; @@ -946,8 +944,7 @@ PyObject_ClearWeakRefs(PyObject *object) tuple = PyTuple_New(count * 2); if (tuple == NULL) { - if (restore_error) - PyErr_Fetch(&err_type, &err_value, &err_tb); + _PyErr_ReplaceException(err_type, err_value, err_tb); return; } @@ -978,7 +975,7 @@ PyObject_ClearWeakRefs(PyObject *object) } Py_DECREF(tuple); } - if (restore_error) - PyErr_Restore(err_type, err_value, err_tb); + assert(!PyErr_Occurred()); + PyErr_Restore(err_type, err_value, err_tb); } } |