bpo-6584: Add a BadGzipFile exception to the gzip module by ZackerySpytz · Pull Request #13022 · python/cpython

Expand Up @@ -11,7 +11,7 @@ import io import _compression
__all__ = ["GzipFile", "open", "compress", "decompress"] __all__ = ["BadGzipFile", "GzipFile", "open", "compress", "decompress"]
FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16
Expand Down Expand Up @@ -112,6 +112,11 @@ def seek(self, off): def seekable(self): return True # Allows fast-forwarding even in unseekable streams

class BadGzipFile(OSError): """Exception raised in some cases for invalid gzip files."""

class GzipFile(_compression.BaseStream): """The GzipFile class simulates most of the methods of a file object with the exception of the truncate() method. Expand Down Expand Up @@ -413,12 +418,12 @@ def _read_gzip_header(self): return False
if magic != b'\037\213': raise OSError('Not a gzipped file (%r)' % magic) raise BadGzipFile('Not a gzipped file (%r)' % magic)
(method, flag, self._last_mtime) = struct.unpack("<BBIxx", self._read_exact(8)) if method != 8: raise OSError('Unknown compression method') raise BadGzipFile('Unknown compression method')
if flag & FEXTRA: # Read & discard the extra field, if present Expand Down Expand Up @@ -502,10 +507,10 @@ def _read_eof(self): # stored is the true file size mod 2**32. crc32, isize = struct.unpack("<II", self._read_exact(8)) if crc32 != self._crc: raise OSError("CRC check failed %s != %s" % (hex(crc32), hex(self._crc))) raise BadGzipFile("CRC check failed %s != %s" % (hex(crc32), hex(self._crc))) elif isize != (self._stream_size & 0xffffffff): raise OSError("Incorrect length of data produced") raise BadGzipFile("Incorrect length of data produced")
# Gzip files can be padded with zeroes and still have archives. # Consume all zero bytes and set the file position to the first Expand Down