Skip to content

Commit 72339b2

Browse files
committed
bpo-28557: error message for bad raw readinto
1 parent e7adf2b commit 72339b2

File tree

4 files changed

+26
-0
lines changed

4 files changed

+26
-0
lines changed

Lib/test/test_io.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,6 +1531,22 @@ def test_args_error(self):
15311531
with self.assertRaisesRegex(TypeError, "BufferedReader"):
15321532
self.tp(io.BytesIO(), 1024, 1024, 1024)
15331533

1534+
def test_bad_readinto_value(self):
1535+
rawio = io.BufferedReader(io.BytesIO(b"12"))
1536+
rawio.readinto = lambda buf: -1
1537+
bufio = self.tp(rawio)
1538+
with self.assertRaises(OSError) as cm:
1539+
bufio.readline()
1540+
assert cm.exception.__cause__ is None
1541+
1542+
def test_bad_readinto_type(self):
1543+
rawio = io.BufferedReader(io.BytesIO(b"12"))
1544+
rawio.readinto = lambda buf: b''
1545+
bufio = self.tp(rawio)
1546+
with self.assertRaises(TypeError) as cm:
1547+
bufio.readline()
1548+
assert isinstance(cm.exception.__cause__, TypeError)
1549+
15341550

15351551
class PyBufferedReaderTest(BufferedReaderTest):
15361552
tp = pyio.BufferedReader

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,6 +1581,7 @@ Péter Szabó
15811581
John Szakmeister
15821582
Piotr Szczepaniak
15831583
Amir Szekely
1584+
David Szotten
15841585
Maciej Szulik
15851586
Joel Taddei
15861587
Arfrever Frehtes Taifersar Arahesis
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve the error message for a misbehaving ``rawio.readinto``

Modules/_io/bufferedio.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1488,6 +1488,14 @@ _bufferedreader_raw_read(buffered *self, char *start, Py_ssize_t len)
14881488
}
14891489
n = PyNumber_AsSsize_t(res, PyExc_ValueError);
14901490
Py_DECREF(res);
1491+
1492+
if (n == -1 && PyErr_Occurred()) {
1493+
_PyErr_TrySetFromCause(
1494+
"raw readinto() returned invalid value"
1495+
);
1496+
return -1;
1497+
}
1498+
14911499
if (n < 0 || n > len) {
14921500
PyErr_Format(PyExc_OSError,
14931501
"raw readinto() returned invalid length %zd "

0 commit comments

Comments
 (0)