Skip to content

Commit e27449d

Browse files
bpo-38635: Simplify decoding the ZIP64 extra field and make it tolerant to extra data. (GH-16988)
1 parent fc6b1bf commit e27449d

File tree

1 file changed

+16
-37
lines changed

1 file changed

+16
-37
lines changed

Lib/zipfile.py

Lines changed: 16 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -465,44 +465,23 @@ def _decodeExtra(self):
465465
if ln+4 > len(extra):
466466
raise BadZipFile("Corrupt extra field %04x (size=%d)" % (tp, ln))
467467
if tp == 0x0001:
468-
if ln >= 24:
469-
counts = unpack('<QQQ', extra[4:28])
470-
elif ln == 16:
471-
counts = unpack('<QQ', extra[4:20])
472-
elif ln == 8:
473-
counts = unpack('<Q', extra[4:12])
474-
elif ln == 0:
475-
counts = ()
476-
else:
477-
raise BadZipFile("Corrupt extra field %04x (size=%d)" % (tp, ln))
478-
479-
idx = 0
480-
468+
data = extra[4:ln+4]
481469
# ZIP64 extension (large files and/or large archives)
482-
if self.file_size in (0xffffffffffffffff, 0xffffffff):
483-
if len(counts) <= idx:
484-
raise BadZipFile(
485-
"Corrupt zip64 extra field. File size not found."
486-
)
487-
self.file_size = counts[idx]
488-
idx += 1
489-
490-
if self.compress_size == 0xFFFFFFFF:
491-
if len(counts) <= idx:
492-
raise BadZipFile(
493-
"Corrupt zip64 extra field. Compress size not found."
494-
)
495-
self.compress_size = counts[idx]
496-
idx += 1
497-
498-
if self.header_offset == 0xffffffff:
499-
if len(counts) <= idx:
500-
raise BadZipFile(
501-
"Corrupt zip64 extra field. Header offset not found."
502-
)
503-
old = self.header_offset
504-
self.header_offset = counts[idx]
505-
idx+=1
470+
try:
471+
if self.file_size in (0xFFFF_FFFF_FFFF_FFFF, 0xFFFF_FFFF):
472+
field = "File size"
473+
self.file_size, = unpack('<Q', data[:8])
474+
data = data[8:]
475+
if self.compress_size == 0xFFFF_FFFF:
476+
field = "Compress size"
477+
self.compress_size, = unpack('<Q', data[:8])
478+
data = data[8:]
479+
if self.header_offset == 0xFFFF_FFFF:
480+
field = "Header offset"
481+
self.header_offset, = unpack('<Q', data[:8])
482+
except struct.error:
483+
raise BadZipFile(f"Corrupt zip64 extra field. "
484+
f"{field} not found.") from None
506485

507486
extra = extra[ln+4:]
508487

0 commit comments

Comments
 (0)