Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit be1c60c

Browse files
Issue #23783: Fixed memory leak in PyObject_ClearWeakRefs() in case of
MemoryError.
2 parents 2c7b5a9 + 4aa8679 commit be1c60c

1 file changed

Lines changed: 4 additions & 7 deletions

File tree

Objects/weakrefobject.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -900,11 +900,9 @@ PyObject_ClearWeakRefs(PyObject *object)
900900
if (*list != NULL) {
901901
PyWeakReference *current = *list;
902902
Py_ssize_t count = _PyWeakref_GetWeakrefCount(current);
903-
int restore_error = PyErr_Occurred() ? 1 : 0;
904903
PyObject *err_type, *err_value, *err_tb;
905904

906-
if (restore_error)
907-
PyErr_Fetch(&err_type, &err_value, &err_tb);
905+
PyErr_Fetch(&err_type, &err_value, &err_tb);
908906
if (count == 1) {
909907
PyObject *callback = current->wr_callback;
910908

@@ -922,8 +920,7 @@ PyObject_ClearWeakRefs(PyObject *object)
922920

923921
tuple = PyTuple_New(count * 2);
924922
if (tuple == NULL) {
925-
if (restore_error)
926-
PyErr_Fetch(&err_type, &err_value, &err_tb);
923+
_PyErr_ChainExceptions(err_type, err_value, err_tb);
927924
return;
928925
}
929926

@@ -954,7 +951,7 @@ PyObject_ClearWeakRefs(PyObject *object)
954951
}
955952
Py_DECREF(tuple);
956953
}
957-
if (restore_error)
958-
PyErr_Restore(err_type, err_value, err_tb);
954+
assert(!PyErr_Occurred());
955+
PyErr_Restore(err_type, err_value, err_tb);
959956
}
960957
}

0 commit comments

Comments
 (0)