]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-140257: fix data race on eval_breaker during finalization (GH-140265) ...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sat, 18 Oct 2025 11:28:53 +0000 (13:28 +0200)
committerGitHub <noreply@github.com>
Sat, 18 Oct 2025 11:28:53 +0000 (11:28 +0000)
gh-140257: fix data race on eval_breaker during finalization (GH-140265)
(cherry picked from commit c8729c9909e150989050ce2a435d018955bea41d)

Co-authored-by: Shamil <ashm.tech@proton.me>
Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst [new file with mode: 0644]
Python/pystate.c

diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst
new file mode 100644 (file)
index 0000000..50f7e0e
--- /dev/null
@@ -0,0 +1,2 @@
+Fix data race between interpreter_clear() and take_gil() on eval_breaker
+during finalization with daemon threads.
index 6859dbc9a7f469bba8f89ae8ee18c33378993f5f..9f6e961e71ae9ff1269d10186a22a2472d7dae60 100644 (file)
@@ -860,10 +860,11 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate)
 
     Py_CLEAR(interp->audit_hooks);
 
-    // At this time, all the threads should be cleared so we don't need atomic
-    // operations for instrumentation_version or eval_breaker.
+    // gh-140257: Threads have already been cleared, but daemon threads may
+    // still access eval_breaker atomically via take_gil() right before they
+    // hang. Use an atomic store to prevent data races during finalization.
     interp->ceval.instrumentation_version = 0;
-    tstate->eval_breaker = 0;
+    _Py_atomic_store_uintptr(&tstate->eval_breaker, 0);
 
     for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) {
         interp->monitors.tools[i] = 0;