Skip to content

Commit

Permalink
bpo-33361: Fix bug with seeking in StreamRecoders (GH-8278)
Browse files Browse the repository at this point in the history
(cherry picked from commit a6ec1ce)

Co-authored-by: Ammar Askar <ammar_askar@hotmail.com>
  • Loading branch information
2 people authored and berkerpeksag committed May 31, 2019
1 parent 49fc57a commit a6dc5d4
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Lib/codecs.py
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,12 @@ def reset(self):
self.reader.reset()
self.writer.reset()

def seek(self, offset, whence=0):
# Seeks must be propagated to both the readers and writers
# as they might need to reset their internal buffers.
self.reader.seek(offset, whence)
self.writer.seek(offset, whence)

def __getattr__(self, name,
getattr=getattr):

Expand Down
25 changes: 25 additions & 0 deletions Lib/test/test_codecs.py
Original file line number Diff line number Diff line change
Expand Up @@ -3318,6 +3318,31 @@ def test_write(self):
sr.write(text.encode('latin1'))
self.assertEqual(bio.getvalue(), text.encode('utf-8'))

def test_seeking_read(self):
bio = io.BytesIO('line1\nline2\nline3\n'.encode('utf-16-le'))
sr = codecs.EncodedFile(bio, 'utf-8', 'utf-16-le')

self.assertEqual(sr.readline(), b'line1\n')
sr.seek(0)
self.assertEqual(sr.readline(), b'line1\n')
self.assertEqual(sr.readline(), b'line2\n')
self.assertEqual(sr.readline(), b'line3\n')
self.assertEqual(sr.readline(), b'')

def test_seeking_write(self):
bio = io.BytesIO('123456789\n'.encode('utf-16-le'))
sr = codecs.EncodedFile(bio, 'utf-8', 'utf-16-le')

# Test that seek() only resets its internal buffer when offset
# and whence are zero.
sr.seek(2)
sr.write(b'\nabc\n')
self.assertEqual(sr.readline(), b'789\n')
sr.seek(0)
self.assertEqual(sr.readline(), b'1\n')
self.assertEqual(sr.readline(), b'abc\n')
self.assertEqual(sr.readline(), b'789\n')


if __name__ == "__main__":
unittest.main()
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix a bug in :class:`codecs.StreamRecoder` where seeking might leave old data in a
buffer and break subsequent read calls. Patch by Ammar Askar.

0 comments on commit a6dc5d4

Please sign in to comment.