Commit 5ba11de8 authored by Georg Brandl's avatar Georg Brandl

#10801: In zipfile, support different encodings for the header and the...

#10801: In zipfile, support different encodings for the header and the filenames.  Patch by MvL, test by Eli Bendersky.
parent d30a0dd6
...@@ -6,6 +6,7 @@ except ImportError: ...@@ -6,6 +6,7 @@ except ImportError:
import io import io
import os import os
import sys
import imp import imp
import time import time
import shutil import shutil
...@@ -23,6 +24,7 @@ from test.support import TESTFN, run_unittest, findfile, unlink ...@@ -23,6 +24,7 @@ from test.support import TESTFN, run_unittest, findfile, unlink
TESTFN2 = TESTFN + "2" TESTFN2 = TESTFN + "2"
TESTFNDIR = TESTFN + "d" TESTFNDIR = TESTFN + "d"
FIXEDTEST_SIZE = 1000 FIXEDTEST_SIZE = 1000
DATAFILES_DIR = 'zipfile_datafiles'
SMALL_TEST_DATA = [('_ziptest1', '1q2w3e4r5t'), SMALL_TEST_DATA = [('_ziptest1', '1q2w3e4r5t'),
('ziptest2dir/_ziptest2', 'qawsedrftg'), ('ziptest2dir/_ziptest2', 'qawsedrftg'),
...@@ -487,6 +489,18 @@ class TestsWithSourceFile(unittest.TestCase): ...@@ -487,6 +489,18 @@ class TestsWithSourceFile(unittest.TestCase):
except zipfile.BadZipFile: except zipfile.BadZipFile:
self.assertTrue(zipfp2.fp is None, 'zipfp is not closed') self.assertTrue(zipfp2.fp is None, 'zipfp is not closed')
def test_unicode_filenames(self):
if __name__ == '__main__':
myfile = sys.argv[0]
else:
myfile = __file__
mydir = os.path.dirname(myfile) or os.curdir
fname = os.path.join(mydir, 'zip_cp437_header.zip')
with zipfile.ZipFile(fname) as zipfp:
zipfp.extractall()
def tearDown(self): def tearDown(self):
unlink(TESTFN) unlink(TESTFN)
unlink(TESTFN2) unlink(TESTFN2)
......
This diff was suppressed by a .gitattributes entry.
...@@ -930,7 +930,13 @@ class ZipFile: ...@@ -930,7 +930,13 @@ class ZipFile:
if fheader[_FH_EXTRA_FIELD_LENGTH]: if fheader[_FH_EXTRA_FIELD_LENGTH]:
zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH]) zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH])
if fname != zinfo.orig_filename.encode("utf-8"): if zinfo.flag_bits & 0x800:
# UTF-8 filename
fname_str = fname.decode("utf-8")
else:
fname_str = fname.decode("cp437")
if fname_str != zinfo.orig_filename:
if not self._filePassed: if not self._filePassed:
zef_file.close() zef_file.close()
raise BadZipFile( raise BadZipFile(
......
...@@ -20,6 +20,9 @@ Core and Builtins ...@@ -20,6 +20,9 @@ Core and Builtins
Library Library
------- -------
- Issue #10801: In zipfile, support different encodings for the header and
the filenames.
- Issue #6285: IDLE no longer crashes on missing help file; patch by Scott - Issue #6285: IDLE no longer crashes on missing help file; patch by Scott
David Daniels. David Daniels.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment