diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 877d3b5..c204a82 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1439,6 +1439,22 @@ class CBufferedReaderTest(BufferedReaderTest, SizeofTest): with self.assertRaisesRegex(TypeError, "BufferedReader"): self.tp(io.BytesIO(), 1024, 1024, 1024) + def test_bad_readinto_value(self): + rawio = io.BufferedReader(io.BytesIO(b"12")) + rawio.readinto = lambda buf: -1 + bufio = self.tp(rawio) + with self.assertRaises(OSError) as cm: + bufio.readline() + assert cm.exception.__cause__ is None + + def test_bad_readinto_type(self): + rawio = io.BufferedReader(io.BytesIO(b"12")) + rawio.readinto = lambda buf: b'' + bufio = self.tp(rawio) + with self.assertRaises(TypeError) as cm: + bufio.readline() + assert isinstance(cm.exception.__cause__, TypeError) + class PyBufferedReaderTest(BufferedReaderTest): tp = pyio.BufferedReader diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index c760522..e0c27d9 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1496,6 +1496,14 @@ _bufferedreader_raw_read(buffered *self, char *start, Py_ssize_t len) } n = PyNumber_AsSsize_t(res, PyExc_ValueError); Py_DECREF(res); + + if (n == -1 && PyErr_Occurred()) { + _PyErr_TrySetFromCause( + "raw readinto() returned invalid value" + ); + return -1; + } + if (n < 0 || n > len) { PyErr_Format(PyExc_IOError, "raw readinto() returned invalid length %zd "