]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-126980: Fix `bytearray.__buffer__` crash on `PyBUF_{READ,WRITE}` (GH-126981...
authorsobolevn <mail@sobolevn.me>
Tue, 19 Nov 2024 17:37:53 +0000 (20:37 +0300)
committerGitHub <noreply@github.com>
Tue, 19 Nov 2024 17:37:53 +0000 (20:37 +0300)
(cherry picked from commit 3932e1db5353bbcf3e3c1133cc9d2cde654cb645)

Co-authored-by: Victor Stinner <vstinner@python.org>
Lib/test/test_buffer.py
Misc/NEWS.d/next/Core_and_Builtins/2024-11-18-23-18-17.gh-issue-126980.r8QHdi.rst [new file with mode: 0644]
Objects/bytearrayobject.c

index e104841171081e344d1e610076630d3baed8899b..d20280ca834a9c0a5974a9b1f64f04b1841e6102 100644 (file)
@@ -4439,6 +4439,14 @@ class TestBufferProtocol(unittest.TestCase):
         x = ndarray([1,2,3], shape=[3], flags=ND_GETBUF_FAIL)
         self.assertRaises(BufferError, memoryview, x)
 
+    def test_bytearray_release_buffer_read_flag(self):
+        # See https://github.com/python/cpython/issues/126980
+        obj = bytearray(b'abc')
+        with self.assertRaises(SystemError):
+            obj.__buffer__(inspect.BufferFlags.READ)
+        with self.assertRaises(SystemError):
+            obj.__buffer__(inspect.BufferFlags.WRITE)
+
     @support.cpython_only
     def test_pybuffer_size_from_format(self):
         # basic tests
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-11-18-23-18-17.gh-issue-126980.r8QHdi.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-11-18-23-18-17.gh-issue-126980.r8QHdi.rst
new file mode 100644 (file)
index 0000000..84484e7
--- /dev/null
@@ -0,0 +1,3 @@
+Fix :meth:`~object.__buffer__` of :class:`bytearray` crashing when
+:attr:`~inspect.BufferFlags.READ` or :attr:`~inspect.BufferFlags.WRITE` are
+passed as flags.
index 80679f93cd4c135360eac2f89afec8a43946caff..a67f41bbfc7039fb5a0c136ba8e856e55548d09f 100644 (file)
@@ -44,15 +44,15 @@ _getbytevalue(PyObject* arg, int *value)
 static int
 bytearray_getbuffer(PyByteArrayObject *obj, Py_buffer *view, int flags)
 {
-    void *ptr;
     if (view == NULL) {
         PyErr_SetString(PyExc_BufferError,
             "bytearray_getbuffer: view==NULL argument is obsolete");
         return -1;
     }
-    ptr = (void *) PyByteArray_AS_STRING(obj);
-    /* cannot fail if view != NULL and readonly == 0 */
-    (void)PyBuffer_FillInfo(view, (PyObject*)obj, ptr, Py_SIZE(obj), 0, flags);
+    void *ptr = (void *) PyByteArray_AS_STRING(obj);
+    if (PyBuffer_FillInfo(view, (PyObject*)obj, ptr, Py_SIZE(obj), 0, flags) < 0) {
+        return -1;
+    }
     obj->ob_exports++;
     return 0;
 }