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