Skip to content

Commit

Permalink
[3.12] gh-108111: Flush gzip write buffer before seeking, fixing bad …
Browse files Browse the repository at this point in the history
…writes (GH-108341) (#108402)

gh-108111: Flush gzip write buffer before seeking, fixing bad writes (GH-108341)
(cherry picked from commit 2eb60c1)

Co-authored-by: Chris Markiewicz <effigies@gmail.com>
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
  • Loading branch information
3 people committed Aug 24, 2023
1 parent 459f24a commit 20357ed
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Lib/gzip.py
Expand Up @@ -401,6 +401,9 @@ def seekable(self):

def seek(self, offset, whence=io.SEEK_SET):
if self.mode == WRITE:
self._check_not_closed()
# Flush buffer to ensure validity of self.offset
self._buffer.flush()
if whence != io.SEEK_SET:
if whence == io.SEEK_CUR:
offset = self.offset + offset
Expand Down
12 changes: 12 additions & 0 deletions Lib/test/test_gzip.py
Expand Up @@ -665,6 +665,18 @@ def flush(self, mode=-1):
]
self.assertEqual(fc.modes, expected_modes)

def test_write_seek_write(self):
# Make sure that offset is up-to-date before seeking
# See issue GH-108111
b = io.BytesIO()
message = b"important message here."
with gzip.GzipFile(fileobj=b, mode='w') as f:
f.write(message)
f.seek(len(message))
f.write(message)
data = b.getvalue()
self.assertEqual(gzip.decompress(data), message * 2)


class TestOpen(BaseTest):
def test_binary_modes(self):
Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Expand Up @@ -1149,6 +1149,7 @@ Colin Marc
Vincent Marchetti
David Marek
Doug Marien
Chris Markiewicz
Sven Marnach
John Marshall
Alex Martelli
Expand Down
@@ -0,0 +1,2 @@
Fix a regression introduced in GH-101251 for 3.12, resulting in an incorrect
offset calculation in :meth:`gzip.GzipFile.seek`.

0 comments on commit 20357ed

Please sign in to comment.