diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 58d3c4883a2..f535e56e9b9 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -434,8 +434,6 @@ class TestsWithSourceFile(unittest.TestCase): ('/foo/bar', 'foo/bar'), ('/foo/../bar', 'foo/bar'), ('/foo/../../bar', 'foo/bar'), - ('//foo/bar', 'foo/bar'), - ('../../foo../../ba..r', 'foo../ba..r'), ] if os.path.sep == '\\': hacknames.extend([ @@ -447,16 +445,22 @@ class TestsWithSourceFile(unittest.TestCase): (r'C:/foo/bar', 'foo/bar'), (r'C://foo/bar', 'foo/bar'), (r'C:\foo\bar', 'foo/bar'), - (r'//conky/mountpoint/foo/bar', 'foo/bar'), - (r'\\conky\mountpoint\foo\bar', 'foo/bar'), + (r'//conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), + (r'\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), (r'///conky/mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), (r'\\\conky\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), (r'//conky//mountpoint/foo/bar', 'conky/mountpoint/foo/bar'), (r'\\conky\\mountpoint\foo\bar', 'conky/mountpoint/foo/bar'), - (r'//?/C:/foo/bar', 'foo/bar'), - (r'\\?\C:\foo\bar', 'foo/bar'), + (r'//?/C:/foo/bar', '_/C_/foo/bar'), + (r'\\?\C:\foo\bar', '_/C_/foo/bar'), (r'C:/../C:/foo/bar', 'C_/foo/bar'), (r'a:b\ce|f"g?h*i', 'b/c_d_e_f_g_h_i'), + ('../../foo../../ba..r', 'foo/ba..r'), + ]) + else: # Unix + hacknames.extend([ + ('//foo/bar', 'foo/bar'), + ('../../foo../../ba..r', 'foo../ba..r'), ]) for arcname, fixedname in hacknames: @@ -469,7 +473,8 @@ class TestsWithSourceFile(unittest.TestCase): with zipfile.ZipFile(TESTFN2, 'r') as zipfp: writtenfile = zipfp.extract(arcname, targetpath) - self.assertEqual(writtenfile, correctfile) + self.assertEqual(writtenfile, correctfile, + msg="extract %r" % arcname) self.check_file(correctfile, content) shutil.rmtree('target') @@ -482,7 +487,8 @@ class TestsWithSourceFile(unittest.TestCase): with zipfile.ZipFile(TESTFN2, 'r') as zipfp: writtenfile = zipfp.extract(arcname) - self.assertEqual(writtenfile, correctfile) + self.assertEqual(writtenfile, correctfile, + msg="extract %r" % arcname) self.check_file(correctfile, content) shutil.rmtree(fixedname.split('/')[0]) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 9af2986bf9a..9d1a98479db 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1050,11 +1050,14 @@ class ZipFile(object): arcname = os.path.splitdrive(arcname)[1] arcname = os.path.sep.join(x for x in arcname.split(os.path.sep) if x not in ('', os.path.curdir, os.path.pardir)) - # filter illegal characters on Windows if os.path.sep == '\\': + # filter illegal characters on Windows illegal = ':<>|"?*' table = string.maketrans(illegal, '_' * len(illegal)) arcname = arcname.translate(table) + # remove trailing dots + arcname = (x.rstrip('.') for x in arcname.split(os.path.sep)) + arcname = os.path.sep.join(x for x in arcname if x) targetpath = os.path.join(targetpath, arcname) targetpath = os.path.normpath(targetpath)