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

This commit is contained in:
Kumar Aditya 2025-08-22 19:57:49 +05:30 committed by GitHub
parent c213eb90a0
commit d619015ecd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 17 additions and 1 deletions

View file

@ -1522,6 +1522,19 @@ def test_ast_fini(self):
""") """)
assert_python_ok("-c", code) 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(): def setUpModule():
global enabled, debug global enabled, debug

View file

@ -0,0 +1 @@
Fix a crash when using the :mod:`warnings` module in a finalizer at shutdown. Patch by Kumar Aditya.

View file

@ -914,7 +914,6 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate)
_Py_ClearExecutorDeletionList(interp); _Py_ClearExecutorDeletionList(interp);
#endif #endif
_PyAST_Fini(interp); _PyAST_Fini(interp);
_PyWarnings_Fini(interp);
_PyAtExit_Fini(interp); _PyAtExit_Fini(interp);
// All Python types must be destroyed before the last GC collection. Python // 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_CollectNoFail(tstate);
_PyGC_Fini(interp); _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. /* We don't clear sysdict and builtins until the end of this function.
Because clearing other attributes can execute arbitrary Python code Because clearing other attributes can execute arbitrary Python code
which requires sysdict and builtins. */ which requires sysdict and builtins. */