]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #23783: Fixed memory leak in PyObject_ClearWeakRefs() in case of
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 30 Mar 2015 06:53:06 +0000 (09:53 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Mon, 30 Mar 2015 06:53:06 +0000 (09:53 +0300)
MemoryError.

Objects/weakrefobject.c

index 871c248ff2e7a4aa1041a7646d6370eea34e64b9..e1f4bc42c2427a88065847579127667c4d70635a 100644 (file)
@@ -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);
     }
 }