From 01c6a8859ef2ff5545a87cf537573bd342c848bf Mon Sep 17 00:00:00 2001 From: Oren Milman Date: Fri, 29 Sep 2017 21:34:31 +0300 Subject: bpo-31602: Fix an assertion failure in zipimporter.get_source() in case of a bad zlib.decompress() (GH-3784) While a rare potential failure (it requires swapping out zlib.decompress() itself and forcing it to return a non-bytes object), this change prevents a potential C-level assertion failure and instead substitutes it with an exception. Thanks to Oren Milman for the patch. --- Lib/test/test_zipimport.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'Lib/test/test_zipimport.py') diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index daa5138751..4a934ff6cb 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -17,6 +17,10 @@ import doctest import inspect import io from traceback import extract_tb, extract_stack, print_tb +try: + import zlib +except ImportError: + zlib = None test_src = """\ def get_name(): @@ -669,6 +673,19 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase): class CompressedZipImportTestCase(UncompressedZipImportTestCase): compression = ZIP_DEFLATED + @support.cpython_only + def test_issue31602(self): + # There shouldn't be an assertion failure in zipimporter.get_source() + # in case of a bad zlib.decompress(). + def bad_decompress(*args): + return None + with ZipFile(TEMP_ZIP, 'w') as zip_file: + self.addCleanup(support.unlink, TEMP_ZIP) + zip_file.writestr('bar.py', b'print("hello world")', ZIP_DEFLATED) + zi = zipimport.zipimporter(TEMP_ZIP) + with support.swap_attr(zlib, 'decompress', bad_decompress): + self.assertRaises(TypeError, zi.get_source, 'bar') + class BadFileZipImportTestCase(unittest.TestCase): def assertZipFailure(self, filename): -- cgit v1.2.1