Skip to content

Commit aefd8d8

Browse files
committed
gh-155074: Fix remaining-space calculation in _pyio.BufferedReader.readinto()
1 parent 96ebb20 commit aefd8d8

3 files changed

Lines changed: 12 additions & 1 deletion

File tree

Lib/_pyio.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1198,7 +1198,8 @@ def _readinto(self, buf, read1):
11981198
while written < len(buf):
11991199

12001200
# First try to read from internal buffer
1201-
avail = min(len(self._read_buf) - self._read_pos, len(buf))
1201+
avail = min(len(self._read_buf) - self._read_pos,
1202+
len(buf) - written)
12021203
if avail:
12031204
buf[written:written+avail] = \
12041205
self._read_buf[self._read_pos:self._read_pos+avail]

Lib/test/test_io/test_bufferedio.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,14 @@ def test_readinto(self):
313313
self.assertEqual(bufio.readinto(b), 1)
314314
self.assertEqual(b, b"cb")
315315

316+
def test_readinto_with_remaining_buffered_data(self):
317+
bufio = self.tp(self.BytesIO(b"abcd"), buffer_size=2)
318+
self.assertEqual(bufio.read(1), b"a")
319+
b = bytearray(2)
320+
self.assertEqual(bufio.readinto(b), 2)
321+
self.assertEqual(b, b"bc")
322+
self.assertEqual(bufio.read(), b"d")
323+
316324
def test_readinto1(self):
317325
buffer_size = 10
318326
rawio = self.MockRawIO((b"abc", b"de", b"fgh", b"jkl"))
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix the pure Python implementation of ``BufferedReader.readinto()`` raising
2+
:exc:`ValueError` after partially filling the destination buffer.

0 commit comments

Comments
 (0)