https://github.com/python/cpython/commit/d619015ecd1c57bde9babc8defaf4c9f8f583be1
commit: d619015ecd1c57bde9babc8defaf4c9f8f583be1
branch: 3.14
author: Kumar Aditya <[email protected]>
committer: hugovk <[email protected]>
date: 2025-08-22T17:27:49+03:00
summary:

[3.14] gh-137384: fix crash when accessing warnings state late in runtime 
shutdown (GH-138027) (#138065)

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2025-08-22-11-39-40.gh-issue-137384.j4b_in.rst
M Lib/test/test_gc.py
M Python/pystate.c

diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index d9e9622992f543..969d290c259f73 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -1522,6 +1522,19 @@ def test_ast_fini(self):
         """)
         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
index 00000000000000..583d751a460eb6
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-22-11-39-40.gh-issue-137384.j4b_in.rst
@@ -0,0 +1 @@
+Fix a crash when using the :mod:`warnings` module in a finalizer at shutdown. 
Patch by Kumar Aditya.
diff --git a/Python/pystate.c b/Python/pystate.c
index aa2c4bd51814c3..02621f36d91c8a 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -914,7 +914,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
@@ -925,6 +924,9 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState 
*tstate)
     _PyGC_CollectNoFail(tstate);
     _PyGC_Fini(interp);
 
+    // Finalize warnings after last gc so that any finalizers can
+    // access warnings state
+    _PyWarnings_Fini(interp);
     /* We don't clear sysdict and builtins until the end of this function.
        Because clearing other attributes can execute arbitrary Python code
        which requires sysdict and builtins. */

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to