summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2022-05-04 10:25:33 (GMT)
committerGitHub <noreply@github.com>2022-05-04 10:25:33 (GMT)
commitf84c51eb7a2c17eaabd77cdf95b5f01b46517206 (patch)
tree4c19da7044751021660eef5a2ccf8f8de203cd7d
parent524d2750e33b4d9c98a562943863abe7fd1236cd (diff)
downloadcpython-f84c51eb7a2c17eaabd77cdf95b5f01b46517206.zip
cpython-f84c51eb7a2c17eaabd77cdf95b5f01b46517206.tar.gz
cpython-f84c51eb7a2c17eaabd77cdf95b5f01b46517206.tar.bz2
gh-92036: Fix gc_fini_untrack() (GH-92037)
Fix a crash in subinterpreters related to the garbage collector. When a subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a crash in deallocator functions expecting objects to be tracked by the GC, leak a strong reference to these objects on purpose, so they are never deleted and their deallocator functions are not called. (cherry picked from commit 14243369b5f80613628a565c224bba7fb3fcacd8) Co-authored-by: Victor Stinner <vstinner@python.org>
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst5
-rw-r--r--Modules/gcmodule.c6
2 files changed, 11 insertions, 0 deletions
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst
new file mode 100644
index 0000000..78094c5
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst
@@ -0,0 +1,5 @@
+Fix a crash in subinterpreters related to the garbage collector. When a
+subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a
+crash in deallocator functions expecting objects to be tracked by the GC, leak
+a strong reference to these objects on purpose, so they are never deleted and
+their deallocator functions are not called. Patch by Victor Stinner.
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 3cf1a00..cb5989e 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -2157,6 +2157,12 @@ gc_fini_untrack(PyGC_Head *list)
for (gc = GC_NEXT(list); gc != list; gc = GC_NEXT(list)) {
PyObject *op = FROM_GC(gc);
_PyObject_GC_UNTRACK(op);
+ // gh-92036: If a deallocator function expect the object to be tracked
+ // by the GC (ex: func_dealloc()), it can crash if called on an object
+ // which is no longer tracked by the GC. Leak one strong reference on
+ // purpose so the object is never deleted and its deallocator is not
+ // called.
+ Py_INCREF(op);
}
}