summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-08-24 10:30:16 (GMT)
committerGitHub <noreply@github.com>2023-08-24 10:30:16 (GMT)
commit20357ed2a434fc59a9cd33c162594e8f792813b4 (patch)
tree99cf016bdddc97891d066bd767835189522848af
parent459f24aef09dce122362ee2f234e97916cbf1e8d (diff)
downloadcpython-20357ed2a434fc59a9cd33c162594e8f792813b4.zip
cpython-20357ed2a434fc59a9cd33c162594e8f792813b4.tar.gz
cpython-20357ed2a434fc59a9cd33c162594e8f792813b4.tar.bz2
[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 2eb60c1934f47671e6b3c9b90b6d9f1912d829a0) Co-authored-by: Chris Markiewicz <effigies@gmail.com> Co-authored-by: Ɓukasz Langa <lukasz@langa.pl>
-rw-r--r--Lib/gzip.py3
-rw-r--r--Lib/test/test_gzip.py12
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS.d/next/Library/2023-08-22-17-27-12.gh-issue-108111.N7a4u_.rst2
4 files changed, 18 insertions, 0 deletions
diff --git a/Lib/gzip.py b/Lib/gzip.py
index cf8b675..177f908 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -401,6 +401,9 @@ class GzipFile(_compression.BaseStream):
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
diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py
index b06b3b0..128f933 100644
--- a/Lib/test/test_gzip.py
+++ b/Lib/test/test_gzip.py
@@ -665,6 +665,18 @@ class TestGzip(BaseTest):
]
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):
diff --git a/Misc/ACKS b/Misc/ACKS
index 645ad5b..d16ec34 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1149,6 +1149,7 @@ Colin Marc
Vincent Marchetti
David Marek
Doug Marien
+Chris Markiewicz
Sven Marnach
John Marshall
Alex Martelli
diff --git a/Misc/NEWS.d/next/Library/2023-08-22-17-27-12.gh-issue-108111.N7a4u_.rst b/Misc/NEWS.d/next/Library/2023-08-22-17-27-12.gh-issue-108111.N7a4u_.rst
new file mode 100644
index 0000000..8eafa6c
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-08-22-17-27-12.gh-issue-108111.N7a4u_.rst
@@ -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`.