diff options
-rw-r--r-- | Lib/test/test_memoryio.py | 14 | ||||
-rw-r--r-- | Modules/_bytesio.c | 12 |
2 files changed, 16 insertions, 10 deletions
diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py index 1afc363..4604caf 100644 --- a/Lib/test/test_memoryio.py +++ b/Lib/test/test_memoryio.py @@ -7,6 +7,7 @@ import unittest from test import test_support import io +import sys try: import _bytesio @@ -403,6 +404,19 @@ if has_c_implementation: class CBytesIOTest(PyBytesIOTest): ioclass = io.BytesIO + def test_overflow(self): + buf = self.buftype("a") + memio = self.ioclass() + + memio.seek(sys.maxsize) + self.assertRaises(OverflowError, memio.seek, 1, 1) + # Ensure that the position has not been changed + self.assertEqual(memio.tell(), sys.maxsize) + self.assertEqual(memio.write(self.EOF), 0) + self.assertRaises(OverflowError, memio.write, buf) + self.assertEqual(memio.tell(), sys.maxsize) + + def test_main(): tests = [PyBytesIOTest, PyStringIOTest] if has_c_implementation: diff --git a/Modules/_bytesio.c b/Modules/_bytesio.c index 00cb06b..9920aaa 100644 --- a/Modules/_bytesio.c +++ b/Modules/_bytesio.c @@ -110,16 +110,8 @@ write_bytes(BytesIOObject *self, const char *bytes, Py_ssize_t len) assert(self->pos >= 0); assert(len >= 0); - /* This overflow check is not strictly necessary. However, it avoids us to - deal with funky things like comparing an unsigned and a signed - integer. */ - if (self->pos > PY_SSIZE_T_MAX - len) { - PyErr_SetString(PyExc_OverflowError, - "new position too large"); - return -1; - } - if (self->pos + len > self->buf_size) { - if (resize_buffer(self, self->pos + len) < 0) + if ((size_t)self->pos + len > self->buf_size) { + if (resize_buffer(self, (size_t)self->pos + len) < 0) return -1; } |