]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-137384: fix crash when accessing warnings state late in runtime shutdown (#138027)
authorKumar Aditya <kumaraditya@python.org>
Fri, 22 Aug 2025 13:40:43 +0000 (19:10 +0530)
committerGitHub <noreply@github.com>
Fri, 22 Aug 2025 13:40:43 +0000 (19:10 +0530)
Lib/test/test_gc.py
Misc/NEWS.d/next/Core_and_Builtins/2025-08-22-11-39-40.gh-issue-137384.j4b_in.rst [new file with mode: 0644]
Python/pystate.c

index 7c9adf3049a13151b0e76fa3ffa8a36db52fc48a..4328909053465eaf2dc0a75c61de9ed6145be510 100644 (file)
@@ -1580,6 +1580,19 @@ class PythonFinalizationTests(unittest.TestCase):
         """)
         assert_python_ok("-c", code)
 
+    def test_warnings_fini(self):
+        # See https://github.com/python/cpython/issues/137384
+        code = textwrap.dedent('''
+            import asyncio
+            from contextvars import ContextVar
+
+            context_loop = ContextVar("context_loop", default=None)
+            loop = asyncio.new_event_loop()
+            context_loop.set(loop)
+        ''')
+
+        assert_python_ok("-c", code)
+
 
 def setUpModule():
     global enabled, debug
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-22-11-39-40.gh-issue-137384.j4b_in.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-22-11-39-40.gh-issue-137384.j4b_in.rst
new file mode 100644 (file)
index 0000000..583d751
--- /dev/null
@@ -0,0 +1 @@
+Fix a crash when using the :mod:`warnings` module in a finalizer at shutdown. Patch by Kumar Aditya.
index 9091057f6f62cfba6e6f9c598204cb7dc131ce53..2465d8667472dc85ca4a9e72227a8bd0b7085cd7 100644 (file)
@@ -805,7 +805,6 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate)
     _Py_ClearExecutorDeletionList(interp);
 #endif
     _PyAST_Fini(interp);
-    _PyWarnings_Fini(interp);
     _PyAtExit_Fini(interp);
 
     // All Python types must be destroyed before the last GC collection. Python
@@ -815,6 +814,10 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate)
     /* Last garbage collection on this interpreter */
     _PyGC_CollectNoFail(tstate);
     _PyGC_Fini(interp);
+
+    // Finalize warnings after last gc so that any finalizers can
+    // access warnings state
+    _PyWarnings_Fini(interp);
     struct _PyExecutorObject *cold = interp->cold_executor;
     if (cold != NULL) {
         interp->cold_executor = NULL;