mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
Changed _bytesio.c to avoid comparing a signed with an unsigned value.
Added tests for overflow checks.
This commit is contained in:
parent
2e0419dcd6
commit
1bfe9dc871
2 changed files with 16 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue