gh-126594: Fix typeobject.c wrap_buffer() cast (GH-126754)
Reject flags smaller than INT_MIN.
(cherry picked from commit
84f07c3a4cbcfe488ccfb4030571be0bc4de7e45)
Co-authored-by: Victor Stinner <vstinner@python.org>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
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):
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);
}