]> granicus.if.org Git - python/commitdiff
#14313: zipfile now raises NotImplementedError when the compression type is unknown.
authorEzio Melotti <ezio.melotti@gmail.com>
Sun, 18 Nov 2012 11:20:36 +0000 (13:20 +0200)
committerEzio Melotti <ezio.melotti@gmail.com>
Sun, 18 Nov 2012 11:20:36 +0000 (13:20 +0200)
Lib/test/test_zipfile.py
Lib/zipfile.py
Misc/NEWS

index 51d8b458c87e46db09f1fdb06d8490ad80dc246a..5bc03b507c39a32a30b023aeb143e5663203f967 100644 (file)
@@ -922,6 +922,17 @@ class OtherTests(unittest.TestCase):
         caught."""
         self.assertRaises(RuntimeError, zipfile.ZipFile, TESTFN, "w", -1)
 
+    def test_unsupported_compression(self):
+        # data is declared as shrunk, but actually deflated
+        data = (b'PK\x03\x04.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00'
+        b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01'
+        b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00'
+        b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+        b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00'
+        b'/\x00\x00\x00!\x00\x00\x00\x00\x00')
+        with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf:
+            self.assertRaises(NotImplementedError, zipf.open, 'x')
+
     def test_null_byte_in_filename(self):
         """Check that a filename containing a null byte is properly
         terminated."""
index 2da70b5e60d3e0941ea26e6764189fc4650d9ade..5b3f6f9603ed33e889954014a9992835e886946d 100644 (file)
@@ -461,6 +461,28 @@ class _ZipDecrypter:
         self._UpdateKeys(c)
         return c
 
+
+compressor_names = {
+    0: 'store',
+    1: 'shrink',
+    2: 'reduce',
+    3: 'reduce',
+    4: 'reduce',
+    5: 'reduce',
+    6: 'implode',
+    7: 'tokenize',
+    8: 'deflate',
+    9: 'deflate64',
+    10: 'implode',
+    12: 'bzip2',
+    14: 'lzma',
+    18: 'terse',
+    19: 'lz77',
+    97: 'wavpack',
+    98: 'ppmd',
+}
+
+
 class ZipExtFile(io.BufferedIOBase):
     """File-like object for reading an archive member.
        Is returned by ZipFile.open().
@@ -487,6 +509,12 @@ class ZipExtFile(io.BufferedIOBase):
 
         if self._compress_type == ZIP_DEFLATED:
             self._decompressor = zlib.decompressobj(-15)
+        elif self._compress_type != ZIP_STORED:
+            descr = compressor_names.get(self._compress_type)
+            if descr:
+                raise NotImplementedError("compression type %d (%s)" % (self._compress_type, descr))
+            else:
+                raise NotImplementedError("compression type %d" % (self._compress_type,))
         self._unconsumed = b''
 
         self._readbuffer = b''
index 3b48a132c6fd1b381e643e6102a94202bffae2b1..3f2f7287befbce1f7210cff00ce0edbf46970fcf 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -164,6 +164,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #14313: zipfile now raises NotImplementedError when the compression
+  type is unknown.
+
 - Issue #16408: Fix file descriptors not being closed in error conditions
   in the zipfile module.  Patch by Serhiy Storchaka.