summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-08-06 20:18:29 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-08-06 20:18:29 (GMT)
commit20e1f932fa7cac639f59de75229088eb7e1286ac (patch)
tree04213adc23fe49445b426d7053a97a9d42fa029a /Lib
parent4a46e1c4b302bbb36cc9d418d6b9f6cf871a4d23 (diff)
downloadcpython-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.py20
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)