Issue #18025: Fixed a segfault in io.BufferedIOBase.readinto() when raw

stream's read() returns more bytes than requested.
This commit is contained in:
Serhiy Storchaka 2013-05-28 16:27:08 +03:00
commit 281945f427
3 changed files with 20 additions and 0 deletions

View File

@ -3027,6 +3027,15 @@ class MiscIOTest(unittest.TestCase):
class CMiscIOTest(MiscIOTest):
io = io
def test_readinto_buffer_overflow(self):
# Issue #18025
class BadReader(self.io.BufferedIOBase):
def read(self, n=-1):
return b'x' * 10**6
bufio = BadReader()
b = bytearray(2)
self.assertRaises(ValueError, bufio.readinto, b)
class PyMiscIOTest(MiscIOTest):
io = pyio

View File

@ -96,6 +96,9 @@ Core and Builtins
Library
-------
- Issue #18025: Fixed a segfault in io.BufferedIOBase.readinto() when raw
stream's read() returns more bytes than requested.
- Issue #18011: base64.b32decode() now raises a binascii.Error if there are
non-alphabet characters present in the input string to conform a docstring.
Updated the module documentation.

View File

@ -69,6 +69,14 @@ bufferediobase_readinto(PyObject *self, PyObject *args)
}
len = Py_SIZE(data);
if (len > buf.len) {
PyErr_Format(PyExc_ValueError,
"read() returned too much data: "
"%zd bytes requested, %zd returned",
buf.len, len);
Py_DECREF(data);
goto error;
}
memcpy(buf.buf, PyBytes_AS_STRING(data), len);
PyBuffer_Release(&buf);