summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2011-01-01 10:09:32 +0000
committerGeorg Brandl <georg@python.org>2011-01-01 10:09:32 +0000
commitc14f4cf0e0c25ba38d691a957f2f9b9b468fcc96 (patch)
tree7ed69e5ae94c008f36bb33dc5ece7ecf0864253b
parent6b92f0f3b9cb8cc1cdc998d972cc4c5730a9dd64 (diff)
downloadcpython-c14f4cf0e0c25ba38d691a957f2f9b9b468fcc96.tar.gz
#10801: In zipfile, support different encodings for the header and the filenames. Patch by MvL, test by Eli Bendersky.
-rw-r--r--Lib/test/test_zipfile.py14
-rw-r--r--Lib/test/zip_cp437_header.zipbin0 -> 270 bytes
-rw-r--r--Lib/zipfile.py8
-rw-r--r--Misc/NEWS3
4 files changed, 24 insertions, 1 deletions
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index d90e771ccb..e8aec4fdf9 100644
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -6,6 +6,7 @@ except ImportError:
import io
import os
+import sys
import imp
import time
import shutil
@@ -23,6 +24,7 @@ from test.support import TESTFN, run_unittest, findfile, unlink
TESTFN2 = TESTFN + "2"
TESTFNDIR = TESTFN + "d"
FIXEDTEST_SIZE = 1000
+DATAFILES_DIR = 'zipfile_datafiles'
SMALL_TEST_DATA = [('_ziptest1', '1q2w3e4r5t'),
('ziptest2dir/_ziptest2', 'qawsedrftg'),
@@ -487,6 +489,18 @@ class TestsWithSourceFile(unittest.TestCase):
except zipfile.BadZipFile:
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):
unlink(TESTFN)
unlink(TESTFN2)
diff --git a/Lib/test/zip_cp437_header.zip b/Lib/test/zip_cp437_header.zip
new file mode 100644
index 0000000000..f7c6cf1704
--- /dev/null
+++ b/Lib/test/zip_cp437_header.zip
Binary files differ
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 197f0bc6e1..50f484873a 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -930,7 +930,13 @@ class ZipFile:
if 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:
zef_file.close()
raise BadZipFile(
diff --git a/Misc/NEWS b/Misc/NEWS
index fd21f73006..c6f5337252 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -20,6 +20,9 @@ Core and Builtins
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
David Daniels.