]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-131141: fix data race in instrumentation while registering callback (#131166)
authorKumar Aditya <kumaraditya@python.org>
Thu, 13 Mar 2025 09:41:26 +0000 (15:11 +0530)
committerGitHub <noreply@github.com>
Thu, 13 Mar 2025 09:41:26 +0000 (09:41 +0000)
Misc/NEWS.d/next/Core_and_Builtins/2025-03-12-11-19-46.gh-issue-131141.tQz594.rst [new file with mode: 0644]
Python/instrumentation.c

diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-03-12-11-19-46.gh-issue-131141.tQz594.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-03-12-11-19-46.gh-issue-131141.tQz594.rst
new file mode 100644 (file)
index 0000000..c1ea679
--- /dev/null
@@ -0,0 +1 @@
+Fix data race in :data:`sys.monitoring` instrumentation while registering callback.
index 3481b5df14288be2aff32c6d087dc7e32000eb59..d4bca27f22cd7423c67515059472209156ebf0ef 100644 (file)
@@ -1399,9 +1399,10 @@ _PyMonitoring_RegisterCallback(int tool_id, int event_id, PyObject *obj)
     PyInterpreterState *is = _PyInterpreterState_GET();
     assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS);
     assert(0 <= event_id && event_id < _PY_MONITORING_EVENTS);
-    PyObject *callback = _Py_atomic_exchange_ptr(&is->monitoring_callables[tool_id][event_id],
-                                                 Py_XNewRef(obj));
-
+    _PyEval_StopTheWorld(is);
+    PyObject *callback = is->monitoring_callables[tool_id][event_id];
+    is->monitoring_callables[tool_id][event_id] = Py_XNewRef(obj);
+    _PyEval_StartTheWorld(is);
     return callback;
 }