gh-112795: Allow `/` folder in a zipfile (#112932)

Allow extraction (no-op) of a "/" folder in a zipfile, they are commonly added by some archive creation tools.

Co-authored-by: Erlend E. Aasland <erlend@python.org>
Co-authored-by: Gregory P. Smith <greg@krypto.org>
This commit is contained in:
AN Long 2024-01-07 09:14:18 +08:00 committed by GitHub
parent 84d1f76092
commit 541c5dbb81
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 1 deletions

View File

@ -577,3 +577,15 @@ class TestPath(unittest.TestCase):
zipfile.Path(alpharep)
with self.assertRaises(KeyError):
alpharep.getinfo('does-not-exist')
def test_root_folder_in_zipfile(self):
"""
gh-112795: Some tools or self constructed codes will add '/' folder to
the zip file, this is a strange behavior, but we should support it.
"""
in_memory_file = io.BytesIO()
zf = zipfile.ZipFile(in_memory_file, "w")
zf.mkdir('/')
zf.writestr('./a.txt', 'aaa')
tmpdir = pathlib.Path(self.fixtures.enter_context(temp_dir()))
zf.extractall(tmpdir)

View File

@ -1772,7 +1772,7 @@ class ZipFile:
# filter illegal characters on Windows
arcname = self._sanitize_windows_name(arcname, os.path.sep)
if not arcname:
if not arcname and not member.is_dir():
raise ValueError("Empty filename.")
targetpath = os.path.join(targetpath, arcname)

View File

@ -0,0 +1,3 @@
Restore the ability for :mod:`zipfile` to ``extractall`` from zip files with
a "/" directory entry in them as is commonly added to zips by some wiki or
bug tracker data exporters.