From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Sat, 18 Oct 2025 11:28:53 +0000 (+0200) Subject: [3.14] gh-140257: fix data race on eval_breaker during finalization (GH-140265) ... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3ca7ea1f8fd593296106346b4dea06f126638aba;p=thirdparty%2FPython%2Fcpython.git [3.14] gh-140257: fix data race on eval_breaker during finalization (GH-140265) (#140294) gh-140257: fix data race on eval_breaker during finalization (GH-140265) (cherry picked from commit c8729c9909e150989050ce2a435d018955bea41d) Co-authored-by: Shamil --- 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 index 000000000000..50f7e0e48ae3 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst @@ -0,0 +1,2 @@ +Fix data race between interpreter_clear() and take_gil() on eval_breaker +during finalization with daemon threads. diff --git a/Python/pystate.c b/Python/pystate.c index 6859dbc9a7f4..9f6e961e71ae 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -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;