Commit 1bfe9dc8 authored by Alexandre Vassalotti's avatar Alexandre Vassalotti

Changed _bytesio.c to avoid comparing a signed with an unsigned value.

Added tests for overflow checks.
parent 2e0419dc
......@@ -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:
......
......@@ -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;
}
......
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