Skip to content

Commit 781881b

Browse files
committed
gh-68164: Set the "regular file" bit in zipfile's writestr
1 parent 8d490b3 commit 781881b

File tree

3 files changed

+8
-6
lines changed

3 files changed

+8
-6
lines changed

Lib/test/test_zipfile/test_core.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ def zip_test_writestr_permissions(self, f, compression):
496496
self.make_test_archive(f, compression)
497497
with zipfile.ZipFile(f, "r") as zipfp:
498498
zinfo = zipfp.getinfo('strfile')
499-
self.assertEqual(zinfo.external_attr, 0o600 << 16)
499+
self.assertEqual(zinfo.external_attr, 0o100600 << 16)
500500

501501
zinfo2 = zipfp.getinfo('written-open-w')
502502
self.assertEqual(zinfo2.external_attr, 0o600 << 16)
@@ -2271,8 +2271,8 @@ def test_for_archive(self):
22712271
zi = zipfile.ZipInfo(base_filename)._for_archive(zf)
22722272
self.assertEqual(zi.compress_level, 1)
22732273
self.assertEqual(zi.compress_type, zipfile.ZIP_STORED)
2274-
# ?rw- --- ---
2275-
filemode = stat.S_IRUSR | stat.S_IWUSR
2274+
# - rw- --- ---
2275+
filemode = stat.S_IFREG | stat.S_IRUSR | stat.S_IWUSR
22762276
# filemode is stored as the highest 16 bits of external_attr
22772277
self.assertEqual(zi.external_attr >> 16, filemode)
22782278
self.assertEqual(zi.external_attr & 0xFF, 0) # no MS-DOS flag

Lib/zipfile/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -630,10 +630,10 @@ def _for_archive(self, archive):
630630
self.compress_type = archive.compression
631631
self.compress_level = archive.compresslevel
632632
if self.filename.endswith('/'): # pragma: no cover
633-
self.external_attr = 0o40775 << 16 # drwxrwxr-x
633+
self.external_attr = (stat.S_IFDIR | 0o775) << 16 # drwxrwxr-x
634634
self.external_attr |= 0x10 # MS-DOS directory flag
635635
else:
636-
self.external_attr = 0o600 << 16 # ?rw-------
636+
self.external_attr = (stat.S_IFREG | 0o600) << 16 # -rw-------
637637
return self
638638

639639
def is_dir(self):
@@ -2012,7 +2012,7 @@ def mkdir(self, zinfo_or_directory_name, mode=511):
20122012
zinfo = ZipInfo(directory_name)
20132013
zinfo.compress_size = 0
20142014
zinfo.CRC = 0
2015-
zinfo.external_attr = ((0o40000 | mode) & 0xFFFF) << 16
2015+
zinfo.external_attr = ((stat.S_IFDIR | mode) & 0xFFFF) << 16
20162016
zinfo.file_size = 0
20172017
zinfo.external_attr |= 0x10
20182018
else:
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :func:`zipfile.ZipFile.writestr` so it sets the "regular file" bit by
2+
default.

0 commit comments

Comments
 (0)