From: Alexandre Vassalotti Date: Wed, 7 May 2008 01:44:31 +0000 (+0000) Subject: Changed _bytesio.c to avoid comparing a signed with an unsigned value. X-Git-Tag: v3.0a5~9 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1bfe9dc871bb3cd6392418410805f0248b1c7d87;p=python Changed _bytesio.c to avoid comparing a signed with an unsigned value. Added tests for overflow checks. --- diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py index 1afc3636a0..4604caf0d1 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 00cb06bf03..9920aaaeb9 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; }