summaryrefslogtreecommitdiff
path: root/Lib/gzip.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/gzip.py')
-rw-r--r--Lib/gzip.py17
1 files changed, 11 insertions, 6 deletions
diff --git a/Lib/gzip.py b/Lib/gzip.py
index 7c86187419..2968f475ef 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -11,7 +11,7 @@ import builtins
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
@@ -112,6 +112,11 @@ class _PaddedFile:
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.
@@ -413,12 +418,12 @@ class _GzipReader(_compression.DecompressReader):
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
@@ -502,10 +507,10 @@ class _GzipReader(_compression.DecompressReader):
# 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