Skip to content

Commit 20357ed

Browse files
miss-islingtoneffigiesambv
authored
[3.12] gh-108111: Flush gzip write buffer before seeking, fixing bad 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 <[email protected]> Co-authored-by: Łukasz Langa <[email protected]>
1 parent 459f24a commit 20357ed

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
@@ -1149,6 +1149,7 @@ Colin Marc
11491149
Vincent Marchetti
11501150
David Marek
11511151
Doug Marien
1152+
Chris Markiewicz
11521153
Sven Marnach
11531154
John Marshall
11541155
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)