]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-136870: fix data race in `PyThreadState_Clear` on `sys_tracing_threads...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 21 Jul 2025 21:01:14 +0000 (23:01 +0200)
committerGitHub <noreply@github.com>
Mon, 21 Jul 2025 21:01:14 +0000 (21:01 +0000)
gh-136870: fix data race in `PyThreadState_Clear` on `sys_tracing_threads` (GH-136951)

In free-threading, multiple threads can be cleared concurrently as such the modifications on `sys_tracing_threads` should be done while holding the profile lock, otherwise it can race with other threads setting up profiling.
(cherry picked from commit f183996eb77fd2d5662c62667298c292c943ebf5)

Co-authored-by: Kumar Aditya <kumaraditya@python.org>
Python/pystate.c

index 015e9f8725c1af5e447e75bfdb3f5d8c76899ad3..aa2c4bd51814c3b82e752079b1ed7bcac12fd45a 100644 (file)
@@ -1793,6 +1793,10 @@ PyThreadState_Clear(PyThreadState *tstate)
           "PyThreadState_Clear: warning: thread still has a generator\n");
     }
 
+#ifdef Py_GIL_DISABLED
+    PyMutex_Lock(&_PyRuntime.ceval.sys_trace_profile_mutex);
+#endif
+
     if (tstate->c_profilefunc != NULL) {
         tstate->interp->sys_profiling_threads--;
         tstate->c_profilefunc = NULL;
@@ -1801,6 +1805,11 @@ PyThreadState_Clear(PyThreadState *tstate)
         tstate->interp->sys_tracing_threads--;
         tstate->c_tracefunc = NULL;
     }
+
+#ifdef Py_GIL_DISABLED
+    PyMutex_Unlock(&_PyRuntime.ceval.sys_trace_profile_mutex);
+#endif
+
     Py_CLEAR(tstate->c_profileobj);
     Py_CLEAR(tstate->c_traceobj);