https://github.com/python/cpython/commit/2b91da7cd4114e7b264ab4a7b7a1c42b79663a6c
commit: 2b91da7cd4114e7b264ab4a7b7a1c42b79663a6c
branch: main
author: Timofei Ivankov <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2026-08-04T14:54:02+05:30
summary:
gh-154044: Fix data race on descriptor __qualname__ in free-threading build
(#154691)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2026-07-25-12-44-13.gh-issue-154044.GBa2wP.rst
M Objects/descrobject.c
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2026-07-25-12-44-13.gh-issue-154044.GBa2wP.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2026-07-25-12-44-13.gh-issue-154044.GBa2wP.rst
new file mode 100644
index 00000000000000..7338ae0210450a
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2026-07-25-12-44-13.gh-issue-154044.GBa2wP.rst
@@ -0,0 +1,2 @@
+Fix a data race on a descriptor's ``__qualname__`` cache in the
+:term:`free-threaded build`.
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 568d978d27d12f..8ceef648988167 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -621,9 +621,17 @@ static PyObject *
descr_get_qualname(PyObject *self, void *Py_UNUSED(ignored))
{
PyDescrObject *descr = (PyDescrObject *)self;
- if (descr->d_qualname == NULL)
- descr->d_qualname = calculate_qualname(descr);
- return Py_XNewRef(descr->d_qualname);
+ PyObject *qualname;
+ Py_BEGIN_CRITICAL_SECTION(self);
+ if (descr->d_qualname == NULL) {
+ PyObject *new_qualname = calculate_qualname(descr);
+ if (new_qualname != NULL) {
+ Py_XSETREF(descr->d_qualname, new_qualname);
+ }
+ }
+ qualname = Py_XNewRef(descr->d_qualname);
+ Py_END_CRITICAL_SECTION();
+ return qualname;
}
static PyObject *
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]