Skip to content

Commit 1d5ec61

Browse files
committed
Fix _scan_data_descriptor_no_sig_by_decompression
1 parent b5d7ae3 commit 1d5ec61

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

Lib/zipfile/__init__.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,12 +1738,6 @@ def _scan_data_descriptor_no_sig(self, fp, offset, end_offset, zip64, chunk_size
17381738
return None
17391739

17401740
def _scan_data_descriptor_no_sig_by_decompression(self, fp, offset, end_offset, zip64, method):
1741-
dd_fmt = '<LQQ' if zip64 else '<LLL'
1742-
dd_size = struct.calcsize(dd_fmt)
1743-
1744-
if offset + dd_size > end_offset:
1745-
return False
1746-
17471741
try:
17481742
decompressor = _get_decompressor(method)
17491743
except NotImplementedError:
@@ -1757,14 +1751,23 @@ def _scan_data_descriptor_no_sig_by_decompression(self, fp, offset, end_offset,
17571751
if isinstance(decompressor, LZMADecompressor):
17581752
return False
17591753

1754+
dd_fmt = '<LQQ' if zip64 else '<LLL'
1755+
dd_size = struct.calcsize(dd_fmt)
1756+
1757+
if end_offset - dd_size < offset:
1758+
return None
1759+
17601760
try:
17611761
pos = self._trace_compressed_block_end(fp, offset, end_offset - dd_size, decompressor)
17621762
except Exception:
17631763
return None
17641764

17651765
fp.seek(pos)
17661766
dd = fp.read(dd_size)
1767-
crc, compress_size, file_size = struct.unpack(dd_fmt, dd)
1767+
try:
1768+
crc, compress_size, file_size = struct.unpack(dd_fmt, dd)
1769+
except struct.error:
1770+
return None
17681771
if pos - offset != compress_size:
17691772
return None
17701773

0 commit comments

Comments
 (0)