From aefd8d810c11043b5b11e6ca94fc245c26452ee1 Mon Sep 17 00:00:00 2001 From: Yang Geonhee Date: Sun, 2 Aug 2026 19:11:33 +0900 Subject: [PATCH] gh-155074: Fix remaining-space calculation in _pyio.BufferedReader.readinto() --- Lib/_pyio.py | 3 ++- Lib/test/test_io/test_bufferedio.py | 8 ++++++++ .../2026-08-02-19-08-17.gh-issue-155074.Vj8qL2.rst | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2026-08-02-19-08-17.gh-issue-155074.Vj8qL2.rst diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 1118b54633b7cc1..73c4abc587082ab 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1198,7 +1198,8 @@ def _readinto(self, buf, read1): while written < len(buf): # First try to read from internal buffer - avail = min(len(self._read_buf) - self._read_pos, len(buf)) + avail = min(len(self._read_buf) - self._read_pos, + len(buf) - written) if avail: buf[written:written+avail] = \ self._read_buf[self._read_pos:self._read_pos+avail] diff --git a/Lib/test/test_io/test_bufferedio.py b/Lib/test/test_io/test_bufferedio.py index e83dd0d4e28d006..eeec609d4cb008d 100644 --- a/Lib/test/test_io/test_bufferedio.py +++ b/Lib/test/test_io/test_bufferedio.py @@ -313,6 +313,14 @@ def test_readinto(self): self.assertEqual(bufio.readinto(b), 1) self.assertEqual(b, b"cb") + def test_readinto_with_remaining_buffered_data(self): + bufio = self.tp(self.BytesIO(b"abcd"), buffer_size=2) + self.assertEqual(bufio.read(1), b"a") + b = bytearray(2) + self.assertEqual(bufio.readinto(b), 2) + self.assertEqual(b, b"bc") + self.assertEqual(bufio.read(), b"d") + def test_readinto1(self): buffer_size = 10 rawio = self.MockRawIO((b"abc", b"de", b"fgh", b"jkl")) diff --git a/Misc/NEWS.d/next/Library/2026-08-02-19-08-17.gh-issue-155074.Vj8qL2.rst b/Misc/NEWS.d/next/Library/2026-08-02-19-08-17.gh-issue-155074.Vj8qL2.rst new file mode 100644 index 000000000000000..70489c9d62f526b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-08-02-19-08-17.gh-issue-155074.Vj8qL2.rst @@ -0,0 +1,2 @@ +Fix the pure Python implementation of ``BufferedReader.readinto()`` raising +:exc:`ValueError` after partially filling the destination buffer.