]> granicus.if.org Git - python/commitdiff
bpo-36991: Fix incorrect exception escaping ZipFile.extract() (GH-13632)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 12 Sep 2019 14:33:53 +0000 (07:33 -0700)
committerGitHub <noreply@github.com>
Thu, 12 Sep 2019 14:33:53 +0000 (07:33 -0700)
(cherry picked from commit 2f1b857562b0f1601c9019db74c29b7d7e21ac9f)

Co-authored-by: Berker Peksag <berker.peksag@gmail.com>
Lib/test/test_zipfile.py
Lib/zipfile.py
Misc/NEWS.d/next/Library/2019-09-12-14-52-38.bpo-36991.1OcSm8.rst [new file with mode: 0644]

index 955e540f96e62769c83e2591c9e2ecf7cbaa0665..76e2f647c607bfab7ab0ffa45b08af5f37f3713d 100644 (file)
@@ -9,6 +9,7 @@ import subprocess
 import sys
 import time
 import unittest
+import unittest.mock as mock
 import zipfile
 
 
@@ -1739,6 +1740,16 @@ class OtherTests(unittest.TestCase):
                 fp.seek(0, os.SEEK_SET)
                 self.assertEqual(fp.tell(), 0)
 
+    @requires_bz2
+    def test_decompress_without_3rd_party_library(self):
+        data = b'PK\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+        zip_file = io.BytesIO(data)
+        with zipfile.ZipFile(zip_file, 'w', compression=zipfile.ZIP_BZIP2) as zf:
+            zf.writestr('a.txt', b'a')
+        with mock.patch('zipfile.bz2', None):
+            with zipfile.ZipFile(zip_file) as zf:
+                self.assertRaises(RuntimeError, zf.extract, 'a.txt')
+
     def tearDown(self):
         unlink(TESTFN)
         unlink(TESTFN2)
index dfd090795019622a84d3cbc04734bff6ec0e8118..59435064eabf2b5eaccf292f3b6fe6ebdd54daa7 100644 (file)
@@ -703,6 +703,7 @@ def _get_compressor(compress_type, compresslevel=None):
 
 
 def _get_decompressor(compress_type):
+    _check_compression(compress_type)
     if compress_type == ZIP_STORED:
         return None
     elif compress_type == ZIP_DEFLATED:
diff --git a/Misc/NEWS.d/next/Library/2019-09-12-14-52-38.bpo-36991.1OcSm8.rst b/Misc/NEWS.d/next/Library/2019-09-12-14-52-38.bpo-36991.1OcSm8.rst
new file mode 100644 (file)
index 0000000..c6fa852
--- /dev/null
@@ -0,0 +1,2 @@
+Fixes a potential incorrect AttributeError exception escaping
+ZipFile.extract() in some unsupported input error situations.