From: bkap123 <97006829+bkap123@users.noreply.github.com> Date: Fri, 13 Mar 2026 12:21:04 +0000 (-0400) Subject: [3.14] gh-145446: Add critical section in functools module for `PyDict_Next` (GH... X-Git-Tag: v3.14.4~147 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=485699216f2186c63f85fc546301e5edbe6b2f22;p=thirdparty%2FPython%2Fcpython.git [3.14] gh-145446: Add critical section in functools module for `PyDict_Next` (GH-145487) (GH-145879) (cherry picked from commit 17eb0354ff3110b27f811343c2d4b3c85f2685d5) --- diff --git a/Misc/NEWS.d/next/Library/2026-03-03-23-21-40.gh-issue-145446.0c-TJX.rst b/Misc/NEWS.d/next/Library/2026-03-03-23-21-40.gh-issue-145446.0c-TJX.rst new file mode 100644 index 000000000000..96eb0d9ddb07 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-03-03-23-21-40.gh-issue-145446.0c-TJX.rst @@ -0,0 +1 @@ +Now :mod:`functools` is safer in free-threaded build when using keywords in :func:`functools.partial` diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index d779376b191a..00c5b33acf2c 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -646,6 +646,8 @@ partial_repr(PyObject *self) } } /* Pack keyword arguments */ + int error = 0; + Py_BEGIN_CRITICAL_SECTION(kw); for (i = 0; PyDict_Next(kw, &i, &key, &value);) { /* Prevent key.__str__ from deleting the value. */ Py_INCREF(value); @@ -653,9 +655,14 @@ partial_repr(PyObject *self) key, value)); Py_DECREF(value); if (arglist == NULL) { - goto done; + error = 1; + break; } } + Py_END_CRITICAL_SECTION(); + if (error) { + goto done; + } mod = PyType_GetModuleName(Py_TYPE(pto)); if (mod == NULL) {