Skip to content

Commit 2eb60c1

Browse files
effigiesambv
andauthored
gh-108111: Flush gzip write buffer before seeking, fixing bad writes (#108341)
Co-authored-by: Łukasz Langa <[email protected]>
1 parent aa9a359 commit 2eb60c1

File tree

4 files changed

+18
-0
lines changed

4 files changed

+18
-0
lines changed

Lib/gzip.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,9 @@ def seekable(self):
401401

402402
def seek(self, offset, whence=io.SEEK_SET):
403403
if self.mode == WRITE:
404+
self._check_not_closed()
405+
# Flush buffer to ensure validity of self.offset
406+
self._buffer.flush()
404407
if whence != io.SEEK_SET:
405408
if whence == io.SEEK_CUR:
406409
offset = self.offset + offset

Lib/test/test_gzip.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,18 @@ def flush(self, mode=-1):
665665
]
666666
self.assertEqual(fc.modes, expected_modes)
667667

668+
def test_write_seek_write(self):
669+
# Make sure that offset is up-to-date before seeking
670+
# See issue GH-108111
671+
b = io.BytesIO()
672+
message = b"important message here."
673+
with gzip.GzipFile(fileobj=b, mode='w') as f:
674+
f.write(message)
675+
f.seek(len(message))
676+
f.write(message)
677+
data = b.getvalue()
678+
self.assertEqual(gzip.decompress(data), message * 2)
679+
668680

669681
class TestOpen(BaseTest):
670682
def test_binary_modes(self):

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,6 +1150,7 @@ Colin Marc
11501150
Vincent Marchetti
11511151
David Marek
11521152
Doug Marien
1153+
Chris Markiewicz
11531154
Sven Marnach
11541155
John Marshall
11551156
Alex Martelli
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix a regression introduced in GH-101251 for 3.12, resulting in an incorrect
2+
offset calculation in :meth:`gzip.GzipFile.seek`.

0 commit comments

Comments
 (0)