mirror of
https://github.com/python/cpython.git
synced 2026-01-07 07:52:29 +00:00
[3.8] bpo-38150: Fix refleak in the finalizer of a _testcapimodule type (GH-16115) (GH-16118)
The PyLong created in the finalizer was not being cleaned up
https://bugs.python.org/issue38150
Automerge-Triggered-By: @matrixise
(cherry picked from commit a67ac2f2d9)
Co-authored-by: Eddie Elizondo <eelizondo@fb.com>
This commit is contained in:
parent
436b429ade
commit
53ff2ca89f
1 changed files with 13 additions and 5 deletions
|
|
@ -6090,7 +6090,7 @@ static void
|
|||
heapctypesubclasswithfinalizer_finalize(PyObject *self)
|
||||
{
|
||||
PyObject *error_type, *error_value, *error_traceback, *m;
|
||||
PyObject *oldtype = NULL, *newtype = NULL;
|
||||
PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
|
||||
|
||||
/* Save the current exception, if any. */
|
||||
PyErr_Fetch(&error_type, &error_value, &error_traceback);
|
||||
|
|
@ -6108,18 +6108,26 @@ heapctypesubclasswithfinalizer_finalize(PyObject *self)
|
|||
if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
|
||||
goto cleanup_finalize;
|
||||
}
|
||||
if (PyObject_SetAttrString(
|
||||
oldtype, "refcnt_in_del", PyLong_FromSsize_t(Py_REFCNT(oldtype))) < 0) {
|
||||
refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
|
||||
if (refcnt == NULL) {
|
||||
goto cleanup_finalize;
|
||||
}
|
||||
if (PyObject_SetAttrString(
|
||||
newtype, "refcnt_in_del", PyLong_FromSsize_t(Py_REFCNT(newtype))) < 0) {
|
||||
if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
|
||||
goto cleanup_finalize;
|
||||
}
|
||||
Py_DECREF(refcnt);
|
||||
refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
|
||||
if (refcnt == NULL) {
|
||||
goto cleanup_finalize;
|
||||
}
|
||||
if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
|
||||
goto cleanup_finalize;
|
||||
}
|
||||
|
||||
cleanup_finalize:
|
||||
Py_XDECREF(oldtype);
|
||||
Py_XDECREF(newtype);
|
||||
Py_XDECREF(refcnt);
|
||||
|
||||
/* Restore the saved exception. */
|
||||
PyErr_Restore(error_type, error_value, error_traceback);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue