]> granicus.if.org Git - python/commitdiff
Changed _bytesio.c to avoid comparing a signed with an unsigned value.
authorAlexandre Vassalotti <alexandre@peadrop.com>
Wed, 7 May 2008 01:44:31 +0000 (01:44 +0000)
committerAlexandre Vassalotti <alexandre@peadrop.com>
Wed, 7 May 2008 01:44:31 +0000 (01:44 +0000)
Added tests for overflow checks.

Lib/test/test_memoryio.py
Modules/_bytesio.c

index 1afc3636a01f1335702ab97a7368aff06274cf24..4604caf0d10238951441aad268a60f0e0be78e8c 100644 (file)
@@ -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:
index 00cb06bf031de07a102465a96b7ec621c01d93e3..9920aaaeb9cab2702bcc23a2c510a33666bbc91e 100644 (file)
@@ -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;
     }