Skip to content

Commit 992347d

Browse files
BoboTiGDinoV
authored andcommitted
bpo-26185: Fix repr() on empty ZipInfo object (#13441)
* bpo-26185: Fix repr() on empty ZipInfo object It was failing on AttributeError due to inexistant but required attributes file_size and compress_size. They are now initialized to 0 in ZipInfo.__init__(). * Remove useless hasattr() in ZipInfo._open_to_write() * Completely remove file_size setting in _open_to_write().
1 parent 1a8de82 commit 992347d

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
lines changed

Lib/test/test_zipfile.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,33 @@ def test_create_zipinfo_before_1980(self):
16551655
self.assertRaises(ValueError,
16561656
zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0))
16571657

1658+
def test_create_empty_zipinfo_repr(self):
1659+
"""Before bpo-26185, repr() on empty ZipInfo object was failing."""
1660+
zi = zipfile.ZipInfo(filename="empty")
1661+
self.assertEqual(repr(zi), "<ZipInfo filename='empty' file_size=0>")
1662+
1663+
def test_create_empty_zipinfo_default_attributes(self):
1664+
"""Ensure all required attributes are set."""
1665+
zi = zipfile.ZipInfo()
1666+
self.assertEqual(zi.orig_filename, "NoName")
1667+
self.assertEqual(zi.filename, "NoName")
1668+
self.assertEqual(zi.date_time, (1980, 1, 1, 0, 0, 0))
1669+
self.assertEqual(zi.compress_type, zipfile.ZIP_STORED)
1670+
self.assertEqual(zi.comment, b"")
1671+
self.assertEqual(zi.extra, b"")
1672+
self.assertIn(zi.create_system, (0, 3))
1673+
self.assertEqual(zi.create_version, zipfile.DEFAULT_VERSION)
1674+
self.assertEqual(zi.extract_version, zipfile.DEFAULT_VERSION)
1675+
self.assertEqual(zi.reserved, 0)
1676+
self.assertEqual(zi.flag_bits, 0)
1677+
self.assertEqual(zi.volume, 0)
1678+
self.assertEqual(zi.internal_attr, 0)
1679+
self.assertEqual(zi.external_attr, 0)
1680+
1681+
# Before bpo-26185, both were missing
1682+
self.assertEqual(zi.file_size, 0)
1683+
self.assertEqual(zi.compress_size, 0)
1684+
16581685
def test_zipfile_with_short_extra_field(self):
16591686
"""If an extra field in the header is less than 4 bytes, skip it."""
16601687
zipdata = (

Lib/zipfile.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -376,11 +376,11 @@ def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)):
376376
self.volume = 0 # Volume number of file header
377377
self.internal_attr = 0 # Internal attributes
378378
self.external_attr = 0 # External file attributes
379+
self.compress_size = 0 # Size of the compressed file
380+
self.file_size = 0 # Size of the uncompressed file
379381
# Other attributes are set by class ZipFile:
380382
# header_offset Byte offset to the file header
381383
# CRC CRC-32 of the uncompressed file
382-
# compress_size Size of the compressed file
383-
# file_size Size of the uncompressed file
384384

385385
def __repr__(self):
386386
result = ['<%s filename=%r' % (self.__class__.__name__, self.filename)]
@@ -1564,9 +1564,7 @@ def _open_to_write(self, zinfo, force_zip64=False):
15641564
"another write handle open on it. "
15651565
"Close the first handle before opening another.")
15661566

1567-
# Sizes and CRC are overwritten with correct data after processing the file
1568-
if not hasattr(zinfo, 'file_size'):
1569-
zinfo.file_size = 0
1567+
# Size and CRC are overwritten with correct data after processing the file
15701568
zinfo.compress_size = 0
15711569
zinfo.CRC = 0
15721570

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :func:`repr` on empty :class:`ZipInfo` object. Patch by Mickaël
2+
Schoentgen.

0 commit comments

Comments
 (0)