From 7e69f0085e5365347bf00f4ed08d07e5f4785a96 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Mon, 8 Apr 2013 22:35:02 +0300 Subject: [PATCH] Close #17666: Fix reading gzip files with an extra field. --- Lib/gzip.py | 3 ++- Lib/test/test_gzip.py | 7 +++++++ Misc/NEWS | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Lib/gzip.py b/Lib/gzip.py index d7da02ca1b..a1f13b491d 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -302,7 +302,8 @@ class GzipFile(io.BufferedIOBase): if flag & FEXTRA: # Read & discard the extra field, if present - self._read_exact(struct.unpack("<H", self._read_exact(2))) + extra_len, = struct.unpack("<H", self._read_exact(2)) + self._read_exact(extra_len) if flag & FNAME: # Read and discard a null-terminated string containing the filename while True: diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index ebd4c43855..37fe8538a7 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -403,6 +403,13 @@ class TestGzip(BaseTest): with gzip.GzipFile(fileobj=io.BytesIO(truncated[:i])) as f: self.assertRaises(EOFError, f.read, 1) + def test_read_with_extra(self): + # Gzip data with an extra field + gzdata = (b'\x1f\x8b\x08\x04\xb2\x17cQ\x02\xff' + b'\x05\x00Extra' + b'\x0bI-.\x01\x002\xd1Mx\x04\x00\x00\x00') + with gzip.GzipFile(fileobj=io.BytesIO(gzdata)) as f: + self.assertEqual(f.read(), b'Test') class TestOpen(BaseTest): def test_binary_modes(self): diff --git a/Misc/NEWS b/Misc/NEWS index 33d9506d8d..969836383a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -21,6 +21,8 @@ Core and Builtins Library ------- +- Issue #17666: Fix reading gzip files with an extra field. + - Issue #17502: Process DEFAULT values in mock side_effect that returns iterator. Patch by Michael Foord. -- 2.40.0