Commit 0e48b6fd authored by Benjamin Peterson's avatar Benjamin Peterson

avoid overflow with large buffer sizes and/or offsets (closes #21831)

parent 5ffa380d
...@@ -4,6 +4,7 @@ For now, tests just new or changed functionality. ...@@ -4,6 +4,7 @@ For now, tests just new or changed functionality.
""" """
import sys
import unittest import unittest
from test import test_support from test import test_support
...@@ -29,6 +30,11 @@ class BufferTests(unittest.TestCase): ...@@ -29,6 +30,11 @@ class BufferTests(unittest.TestCase):
m = memoryview(b) # Should not raise an exception m = memoryview(b) # Should not raise an exception
self.assertEqual(m.tobytes(), s) self.assertEqual(m.tobytes(), s)
def test_large_buffer_size_and_offset(self):
data = bytearray('hola mundo')
buf = buffer(data, sys.maxsize, sys.maxsize)
self.assertEqual(buf[:4096], "")
def test_main(): def test_main():
with test_support.check_py3k_warnings(("buffer.. not supported", with test_support.check_py3k_warnings(("buffer.. not supported",
......
...@@ -10,6 +10,9 @@ What's New in Python 2.7.8? ...@@ -10,6 +10,9 @@ What's New in Python 2.7.8?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #21831: Avoid integer overflow when large sizes and offsets are given to
the buffer type.
- Issue #1856: Avoid crashes and lockups when daemon threads run while the - Issue #1856: Avoid crashes and lockups when daemon threads run while the
interpreter is shutting down; instead, these threads are now killed when they interpreter is shutting down; instead, these threads are now killed when they
try to take the GIL. try to take the GIL.
......
...@@ -88,7 +88,7 @@ get_buf(PyBufferObject *self, void **ptr, Py_ssize_t *size, ...@@ -88,7 +88,7 @@ get_buf(PyBufferObject *self, void **ptr, Py_ssize_t *size,
*size = count; *size = count;
else else
*size = self->b_size; *size = self->b_size;
if (offset + *size > count) if (*size > count - offset)
*size = count - offset; *size = count - offset;
} }
return 1; return 1;
...@@ -875,4 +875,4 @@ PyTypeObject PyBuffer_Type = { ...@@ -875,4 +875,4 @@ PyTypeObject PyBuffer_Type = {
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
buffer_new, /* tp_new */ buffer_new, /* tp_new */
}; };
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment