https://github.com/python/cpython/commit/a076a55ad2a318cd8b7010d85ccf21ccd0a98555
commit: a076a55ad2a318cd8b7010d85ccf21ccd0a98555
branch: main
author: Jelle Zijlstra <[email protected]>
committer: JelleZijlstra <[email protected]>
date: 2026-10-22T15:26:16-07:00
summary:
gh-159739: Keep descriptor metadata dictionaries alive during insertion
(#160193)
The classmethod and staticmethod metadata setters dropped their reference to
the descriptor dictionary before inserting the new value. A key comparison or
value finalizer can replace the dictionary during insertion, leaving the
operation using released memory. Keep the dictionary alive until insertion
finishes. Backport to 3.15 and 3.14.
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2026-10-21-21-26-10.gh-issue-159739.CbTE4N.rst
M Objects/funcobject.c
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2026-10-21-21-26-10.gh-issue-159739.CbTE4N.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2026-10-21-21-26-10.gh-issue-159739.CbTE4N.rst
new file mode 100644
index 00000000000000..20072791808dd1
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2026-10-21-21-26-10.gh-issue-159739.CbTE4N.rst
@@ -0,0 +1 @@
+Fix a possible crash when assigning metadata to :class:`classmethod` or
:class:`staticmethod` objects.
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index f4adaf390e0cf9..d5caa7fceb05be 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -1460,8 +1460,9 @@ descriptor_set_wrapped_attribute(PyObject *oobj, PyObject
*name, PyObject *value
return 0;
}
else {
+ int result = PyDict_SetItem(dict, name, value);
Py_DECREF(dict);
- return PyDict_SetItem(dict, name, value);
+ return result;
}
}
_______________________________________________
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]