https://github.com/python/cpython/commit/e85f81f4309bda4649d99c6b6a8bec9fb53346cd
commit: e85f81f4309bda4649d99c6b6a8bec9fb53346cd
branch: main
author: Tomasz Pytel <tompy...@gmail.com>
committer: kumaraditya303 <kumaradi...@python.org>
date: 2025-02-27T20:29:58+05:30
summary:

gh-129107: fix thread safety of `bytearray` where two critical sections are 
needed (#130227)

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2025-02-17-15-32-26.gh-issue-129107.fPPBLw.rst
M Lib/test/test_bytes.py
M Objects/bytearrayobject.c

diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py
index 907988c27eba0a..f6ffe83c5d69e8 100644
--- a/Lib/test/test_bytes.py
+++ b/Lib/test/test_bytes.py
@@ -2380,12 +2380,22 @@ def ass_subscript(b, a):  # MODIFIES!
             b.wait()
             a[:] = c
 
+        def ass_subscript2(b, a, c):  # MODIFIES!
+            b.wait()
+            a[:] = c
+            assert b'\xdd' not in a
+
         def mod(b, a):
             c = tuple(range(4096))
             b.wait()
             try: a % c
             except TypeError: pass
 
+        def mod2(b, a, c):
+            b.wait()
+            d = a % c
+            assert b'\xdd' not in d
+
         def repr_(b, a):
             b.wait()
             repr(a)
@@ -2503,7 +2513,9 @@ def check(funcs, a=None, *args):
 
         check([clear] + [contains] * 10)
         check([clear] + [subscript] * 10)
+        check([clear2] + [ass_subscript2] * 10, None, bytearray(b'0' * 
0x400000))
         check([clear] + [mod] * 10, bytearray(b'%d' * 4096))
+        check([clear2] + [mod2] * 10, bytearray(b'%s'), bytearray(b'0' * 
0x400000))
 
         check([clear] + [capitalize] * 10, bytearray(b'a' * 0x40000))
         check([clear] + [center] * 10, bytearray(b'a' * 0x40000))
diff --git 
a/Misc/NEWS.d/next/Core_and_Builtins/2025-02-17-15-32-26.gh-issue-129107.fPPBLw.rst
 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-17-15-32-26.gh-issue-129107.fPPBLw.rst
new file mode 100644
index 00000000000000..ca921f4d6c8893
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-17-15-32-26.gh-issue-129107.fPPBLw.rst
@@ -0,0 +1 @@
+Fix two more :class:`bytearray` functions for :term:`free threading`.
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index f2cfd4aed3979f..34f43eb8c31315 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -864,9 +864,16 @@ static int
 bytearray_ass_subscript(PyObject *op, PyObject *index, PyObject *values)
 {
     int ret;
-    Py_BEGIN_CRITICAL_SECTION(op);
-    ret = bytearray_ass_subscript_lock_held(op, index, values);
-    Py_END_CRITICAL_SECTION();
+    if (values != NULL && PyByteArray_Check(values)) {
+        Py_BEGIN_CRITICAL_SECTION2(op, values);
+        ret = bytearray_ass_subscript_lock_held(op, index, values);
+        Py_END_CRITICAL_SECTION2();
+    }
+    else {
+        Py_BEGIN_CRITICAL_SECTION(op);
+        ret = bytearray_ass_subscript_lock_held(op, index, values);
+        Py_END_CRITICAL_SECTION();
+    }
     return ret;
 }
 
@@ -2751,9 +2758,16 @@ static PyObject *
 bytearray_mod(PyObject *v, PyObject *w)
 {
     PyObject *ret;
-    Py_BEGIN_CRITICAL_SECTION(v);
-    ret = bytearray_mod_lock_held(v, w);
-    Py_END_CRITICAL_SECTION();
+    if (PyByteArray_Check(w)) {
+        Py_BEGIN_CRITICAL_SECTION2(v, w);
+        ret = bytearray_mod_lock_held(v, w);
+        Py_END_CRITICAL_SECTION2();
+    }
+    else {
+        Py_BEGIN_CRITICAL_SECTION(v);
+        ret = bytearray_mod_lock_held(v, w);
+        Py_END_CRITICAL_SECTION();
+    }
     return ret;
 }
 

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to