]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-149590: Remove faulthandler_traverse (#150023)
authorArmaan Vakharia <43391096+armaan-v924@users.noreply.github.com>
Mon, 18 May 2026 23:00:59 +0000 (16:00 -0700)
committerGitHub <noreply@github.com>
Mon, 18 May 2026 23:00:59 +0000 (16:00 -0700)
`faulthandler_traverse` visits Python objects owned by `_PyRuntime`, not
by the module instance. With multi-phase init allowing multiple module
instances, each instance's GC traversal decrements `gc_refs` on the same
runtime-owned objects, driving it negative when two instances are
collected simultaneously.

Misc/NEWS.d/next/Core_and_Builtins/2026-05-18-13-47-17.gh-issue-149590.IPBeQx.rst [new file with mode: 0644]
Modules/faulthandler.c

diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-05-18-13-47-17.gh-issue-149590.IPBeQx.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-05-18-13-47-17.gh-issue-149590.IPBeQx.rst
new file mode 100644 (file)
index 0000000..8d3b29d
--- /dev/null
@@ -0,0 +1 @@
+Fix crash when faulthandler is imported more than once.
index 1b4f0c2302daae25dd6915ef797b63696d20c7a3..fa7fb7085d7e8b988d74a5fabbca6d0e24d3fd7c 100644 (file)
@@ -1349,21 +1349,6 @@ faulthandler__stack_overflow_impl(PyObject *module)
 #endif   /* defined(FAULTHANDLER_USE_ALT_STACK) && defined(HAVE_SIGACTION) */
 
 
-static int
-faulthandler_traverse(PyObject *module, visitproc visit, void *arg)
-{
-    Py_VISIT(thread.file);
-#ifdef FAULTHANDLER_USER
-    if (user_signals != NULL) {
-        for (size_t signum=0; signum < Py_NSIG; signum++)
-            Py_VISIT(user_signals[signum].file);
-    }
-#endif
-    Py_VISIT(fatal_error.file);
-    return 0;
-}
-
-
 #ifdef MS_WINDOWS
 /*[clinic input]
 faulthandler._raise_exception
@@ -1459,7 +1444,6 @@ static struct PyModuleDef module_def = {
     .m_name = "faulthandler",
     .m_doc = module_doc,
     .m_methods = module_methods,
-    .m_traverse = faulthandler_traverse,
     .m_slots = faulthandler_slots
 };