diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-08-06 20:18:29 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-08-06 20:18:29 (GMT) |
commit | 20e1f932fa7cac639f59de75229088eb7e1286ac (patch) | |
tree | 04213adc23fe49445b426d7053a97a9d42fa029a /Lib | |
parent | 4a46e1c4b302bbb36cc9d418d6b9f6cf871a4d23 (diff) | |
download | cpython-20e1f932fa7cac639f59de75229088eb7e1286ac.zip cpython-20e1f932fa7cac639f59de75229088eb7e1286ac.tar.gz cpython-20e1f932fa7cac639f59de75229088eb7e1286ac.tar.bz2 |
Issue #6629: Fix a data corruption issue in the new `io` package, which could
occur when writing to a BufferedRandom object (e.g. a file opened in "rb+" or
"wb+" mode) after having buffered a certain amount of data for reading. This
bug was not present in the pure Python implementation.
Yes, this is a serious issue.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_io.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 76ce347..edb593b 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1336,6 +1336,26 @@ class BufferedRandomTest(BufferedReaderTest, BufferedWriterTest): bufio.readinto(bytearray(1)) self.check_writes(_read) + def test_write_after_readahead(self): + # Issue #6629: writing after the buffer was filled by readahead should + # first rewind the raw stream. + for overwrite_size in [1, 5]: + raw = self.BytesIO(b"A" * 10) + bufio = self.tp(raw, 4) + # Trigger readahead + self.assertEqual(bufio.read(1), b"A") + self.assertEqual(bufio.tell(), 1) + # Overwriting should rewind the raw stream if it needs so + bufio.write(b"B" * overwrite_size) + self.assertEqual(bufio.tell(), overwrite_size + 1) + # If the write size was smaller than the buffer size, flush() and + # check that rewind happens. + bufio.flush() + self.assertEqual(bufio.tell(), overwrite_size + 1) + s = raw.getvalue() + self.assertEqual(s, + b"A" + b"B" * overwrite_size + b"A" * (9 - overwrite_size)) + def test_misbehaved_io(self): BufferedReaderTest.test_misbehaved_io(self) BufferedWriterTest.test_misbehaved_io(self) |