From 61d6e0c130776a0f89bfbb3a5292d0467fbc3d39 Mon Sep 17 00:00:00 2001 From: Peter Hawkins Date: Thu, 6 Feb 2025 13:49:29 -0500 Subject: [PATCH] [3.13] gh-129732: Fix race on `shared->array` in qsbr code under free-threading (gh-129738) The read of `shared->array` should happen under the lock to avoid a race. (cherry picked from commit b4ff8b22b3066b814c3758f87eaddfa923e657ed) Co-authored-by: Peter Hawkins --- .../2025-02-06-17-57-33.gh-issue-129732.yl97oq.rst | 1 + Python/qsbr.c | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2025-02-06-17-57-33.gh-issue-129732.yl97oq.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2025-02-06-17-57-33.gh-issue-129732.yl97oq.rst b/Misc/NEWS.d/next/Core and Builtins/2025-02-06-17-57-33.gh-issue-129732.yl97oq.rst new file mode 100644 index 00000000000000..a4b104af61692a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2025-02-06-17-57-33.gh-issue-129732.yl97oq.rst @@ -0,0 +1 @@ +Fixed a race in ``_Py_qsbr_reserve`` in the free threading build. diff --git a/Python/qsbr.c b/Python/qsbr.c index a40219acfe2c29..0df1285cc8e063 100644 --- a/Python/qsbr.c +++ b/Python/qsbr.c @@ -205,15 +205,15 @@ _Py_qsbr_reserve(PyInterpreterState *interp) } _PyEval_StartTheWorld(interp); } - PyMutex_Unlock(&shared->mutex); - - if (qsbr == NULL) { - return -1; - } // Return an index rather than the pointer because the array may be // resized and the pointer invalidated. - return (struct _qsbr_pad *)qsbr - shared->array; + Py_ssize_t index = -1; + if (qsbr != NULL) { + index = (struct _qsbr_pad *)qsbr - shared->array; + } + PyMutex_Unlock(&shared->mutex); + return index; } void