]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.15] gh-150858: fix data race while changing `__qualname__` of a type object(GH...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 15 Jul 2026 10:42:48 +0000 (12:42 +0200)
committerGitHub <noreply@github.com>
Wed, 15 Jul 2026 10:42:48 +0000 (10:42 +0000)
gh-150858: fix data race while changing `__qualname__` of a type object(GH-150859)
(cherry picked from commit 1ec6596828b0db4317d85afa85e1f68a3551a07e)

Co-authored-by: Thomas Kowalski <thom.kowa@gmail.com>
Misc/NEWS.d/next/Core_and_Builtins/2026-06-03-16-27-00.gh-issue-150858.j2dSkD.rst [new file with mode: 0644]
Objects/typeobject.c

diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-06-03-16-27-00.gh-issue-150858.j2dSkD.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-06-03-16-27-00.gh-issue-150858.j2dSkD.rst
new file mode 100644 (file)
index 0000000..dcb932b
--- /dev/null
@@ -0,0 +1 @@
+Fix a data race while changing ``__qualname__`` of a type concurrently on free-threaded builds.
index f763f9f5eba58fb32f456798d73260d2f7e23b32..8108e8e92731dadeced0124a47ca69019a16409b 100644 (file)
@@ -1594,7 +1594,12 @@ type_set_qualname(PyObject *tp, PyObject *value, void *context)
     }
 
     et = (PyHeapTypeObject*)type;
-    Py_SETREF(et->ht_qualname, Py_NewRef(value));
+    PyInterpreterState *interp = _PyInterpreterState_GET();
+    _PyEval_StopTheWorld(interp);
+    PyObject *old_qualname = et->ht_qualname;
+    et->ht_qualname = Py_NewRef(value);
+    _PyEval_StartTheWorld(interp);
+    Py_DECREF(old_qualname);
     return 0;
 }