Issue #23783: Fixed memory leak in PyObject_ClearWeakRefs() in case of
MemoryError.
This commit is contained in:
commit
be1c60c3f6
|
@ -900,11 +900,9 @@ PyObject_ClearWeakRefs(PyObject *object)
|
||||||
if (*list != NULL) {
|
if (*list != NULL) {
|
||||||
PyWeakReference *current = *list;
|
PyWeakReference *current = *list;
|
||||||
Py_ssize_t count = _PyWeakref_GetWeakrefCount(current);
|
Py_ssize_t count = _PyWeakref_GetWeakrefCount(current);
|
||||||
int restore_error = PyErr_Occurred() ? 1 : 0;
|
|
||||||
PyObject *err_type, *err_value, *err_tb;
|
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) {
|
if (count == 1) {
|
||||||
PyObject *callback = current->wr_callback;
|
PyObject *callback = current->wr_callback;
|
||||||
|
|
||||||
|
@ -922,8 +920,7 @@ PyObject_ClearWeakRefs(PyObject *object)
|
||||||
|
|
||||||
tuple = PyTuple_New(count * 2);
|
tuple = PyTuple_New(count * 2);
|
||||||
if (tuple == NULL) {
|
if (tuple == NULL) {
|
||||||
if (restore_error)
|
_PyErr_ChainExceptions(err_type, err_value, err_tb);
|
||||||
PyErr_Fetch(&err_type, &err_value, &err_tb);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -954,7 +951,7 @@ PyObject_ClearWeakRefs(PyObject *object)
|
||||||
}
|
}
|
||||||
Py_DECREF(tuple);
|
Py_DECREF(tuple);
|
||||||
}
|
}
|
||||||
if (restore_error)
|
assert(!PyErr_Occurred());
|
||||||
PyErr_Restore(err_type, err_value, err_tb);
|
PyErr_Restore(err_type, err_value, err_tb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue