From: Serhiy Storchaka Date: Mon, 30 Mar 2015 06:52:29 +0000 (+0300) Subject: Issue #23783: Fixed memory leak in PyObject_ClearWeakRefs() in case of X-Git-Tag: v3.5.0a4~260^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4aa867959f19ce92ccf999aa9f9dc4bd0b49ead7;p=thirdparty%2FPython%2Fcpython.git Issue #23783: Fixed memory leak in PyObject_ClearWeakRefs() in case of MemoryError. --- diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index c083f8fce5e8..d4d52e60aea8 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -900,11 +900,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; @@ -922,8 +920,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_ChainExceptions(err_type, err_value, err_tb); return; } @@ -954,7 +951,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); } }