gh-68164: Set the "regular file" bit in zipfile's writestr

This commit is contained in:
Tim Hatch 2025-05-19 07:33:00 -07:00
parent 8d490b3687
commit 781881b7f0
3 changed files with 8 additions and 6 deletions

View file

@ -496,7 +496,7 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile,
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)
@ -2271,8 +2271,8 @@ class OtherTests(unittest.TestCase):
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

View file

@ -630,10 +630,10 @@ class ZipInfo:
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):
@ -2012,7 +2012,7 @@ class ZipFile:
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:

View file

@ -0,0 +1,2 @@
Fix :func:`zipfile.ZipFile.writestr` so it sets the "regular file" bit by
default.