summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_zipfile/_path/test_path.py12
-rw-r--r--Lib/zipfile/__init__.py2
-rw-r--r--Misc/NEWS.d/next/Library/2024-01-07-00-56-41.gh-issue-112932.OfhUu7.rst3
3 files changed, 16 insertions, 1 deletions
diff --git a/Lib/test/test_zipfile/_path/test_path.py b/Lib/test/test_zipfile/_path/test_path.py
index c66cb3c..171ab6f 100644
--- a/Lib/test/test_zipfile/_path/test_path.py
+++ b/Lib/test/test_zipfile/_path/test_path.py
@@ -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)
diff --git a/Lib/zipfile/__init__.py b/Lib/zipfile/__init__.py
index 420d2f8..e289c6c 100644
--- a/Lib/zipfile/__init__.py
+++ b/Lib/zipfile/__init__.py
@@ -1758,7 +1758,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)
diff --git a/Misc/NEWS.d/next/Library/2024-01-07-00-56-41.gh-issue-112932.OfhUu7.rst b/Misc/NEWS.d/next/Library/2024-01-07-00-56-41.gh-issue-112932.OfhUu7.rst
new file mode 100644
index 0000000..c61525c
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-01-07-00-56-41.gh-issue-112932.OfhUu7.rst
@@ -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.