]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-126594: Fix typeobject.c wrap_buffer() cast (#126754)
authorVictor Stinner <vstinner@python.org>
Tue, 19 Nov 2024 08:13:20 +0000 (09:13 +0100)
committerGitHub <noreply@github.com>
Tue, 19 Nov 2024 08:13:20 +0000 (09:13 +0100)
Reject flags smaller than INT_MIN.

Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
Lib/test/test_buffer.py
Objects/typeobject.c

index cb38a69e390f3abb59a993a381fb10b7e0a5e3bd..332e49ce9f1b1717a4fcda9aa1486871b6fe3f0e 100644 (file)
@@ -4446,6 +4446,21 @@ class TestBufferProtocol(unittest.TestCase):
             self.assertEqual(_testcapi.PyBuffer_SizeFromFormat(format),
                              struct.calcsize(format))
 
+    @support.cpython_only
+    def test_flags_overflow(self):
+        # gh-126594: Check for integer overlow on large flags
+        try:
+            from _testcapi import INT_MIN, INT_MAX
+        except ImportError:
+            INT_MIN = -(2 ** 31)
+            INT_MAX = 2 ** 31 - 1
+
+        obj = b'abc'
+        for flags in (INT_MIN - 1, INT_MAX + 1):
+            with self.subTest(flags=flags):
+                with self.assertRaises(OverflowError):
+                    obj.__buffer__(flags)
+
 
 class TestPythonBufferProtocol(unittest.TestCase):
     def test_basic(self):
index a6cf3da542b691371623744f1f1b2a2916e30dcf..840d004d3d98c71a16bcc0931343257e16fb9a2d 100644 (file)
@@ -9314,13 +9314,13 @@ wrap_buffer(PyObject *self, PyObject *args, void *wrapped)
     if (flags == -1 && PyErr_Occurred()) {
         return NULL;
     }
-    if (flags > INT_MAX) {
+    if (flags > INT_MAX || flags < INT_MIN) {
         PyErr_SetString(PyExc_OverflowError,
-                        "buffer flags too large");
+                        "buffer flags out of range");
         return NULL;
     }
 
-    return _PyMemoryView_FromBufferProc(self, Py_SAFE_DOWNCAST(flags, Py_ssize_t, int),
+    return _PyMemoryView_FromBufferProc(self, (int)flags,
                                         (getbufferproc)wrapped);
 }