diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index 0d407371f40a0f..dbbee96cc9684e 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -496,7 +496,7 @@ def zip_test_writestr_permissions(self, f, compression): self.make_test_archive(f, compression) with zipfile.ZipFile(f, "r") as zipfp: zinfo = zipfp.getinfo('strfile') - self.assertEqual(zinfo.external_attr, 0o600 << 16) + self.assertEqual(zinfo.external_attr, 0o100600 << 16) zinfo2 = zipfp.getinfo('written-open-w') self.assertEqual(zinfo2.external_attr, 0o600 << 16) @@ -2366,8 +2366,8 @@ def test_for_archive(self): zi = zipfile.ZipInfo(base_filename)._for_archive(zf) self.assertEqual(zi.compress_level, 1) self.assertEqual(zi.compress_type, zipfile.ZIP_STORED) - # ?rw- --- --- - filemode = stat.S_IRUSR | stat.S_IWUSR + # - rw- --- --- + filemode = stat.S_IFREG | stat.S_IRUSR | stat.S_IWUSR # filemode is stored as the highest 16 bits of external_attr self.assertEqual(zi.external_attr >> 16, filemode) self.assertEqual(zi.external_attr & 0xFF, 0) # no MS-DOS flag diff --git a/Lib/zipfile/__init__.py b/Lib/zipfile/__init__.py index 86c3bc36b695c7..591e016dba1a9c 100644 --- a/Lib/zipfile/__init__.py +++ b/Lib/zipfile/__init__.py @@ -670,10 +670,10 @@ def _for_archive(self, archive): self.compress_type = archive.compression self.compress_level = archive.compresslevel if self.filename.endswith('/'): # pragma: no cover - self.external_attr = 0o40775 << 16 # drwxrwxr-x + self.external_attr = (stat.S_IFDIR | 0o775) << 16 # drwxrwxr-x self.external_attr |= 0x10 # MS-DOS directory flag else: - self.external_attr = 0o600 << 16 # ?rw------- + self.external_attr = (stat.S_IFREG | 0o600) << 16 # -rw------- return self def is_dir(self): @@ -2043,7 +2043,7 @@ def mkdir(self, zinfo_or_directory_name, mode=511): zinfo = ZipInfo(directory_name) zinfo.compress_size = 0 zinfo.CRC = 0 - zinfo.external_attr = ((0o40000 | mode) & 0xFFFF) << 16 + zinfo.external_attr = ((stat.S_IFDIR | mode) & 0xFFFF) << 16 zinfo.file_size = 0 zinfo.external_attr |= 0x10 else: diff --git a/Misc/NEWS.d/next/Library/2025-05-19-07-32-51.gh-issue-68164.XhFbJD.rst b/Misc/NEWS.d/next/Library/2025-05-19-07-32-51.gh-issue-68164.XhFbJD.rst new file mode 100644 index 00000000000000..21c1ed188c2507 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-19-07-32-51.gh-issue-68164.XhFbJD.rst @@ -0,0 +1,2 @@ +Fix :func:`zipfile.ZipFile.writestr` so it sets the "regular file" bit by +default.