Skip to content

Commit 88197b3

Browse files
committed
Optimize _decodeExtra using unpack_from
Use `unpack_from` with offset to prevent bytes slicing.
1 parent 6860dc5 commit 88197b3

1 file changed

Lines changed: 9 additions & 10 deletions

File tree

Lib/zipfile/__init__.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -599,33 +599,32 @@ def _encodeFilenameFlags(self):
599599

600600
def _decodeExtra(self, filename_crc):
601601
# Try to decode the extra field.
602-
unpack = struct.unpack
602+
unpack_from = struct.unpack_from
603603
for extra, tp in _Extra.iter(self.extra, True):
604+
pos = 4
604605
if tp == 0x0001:
605-
data = extra[4:]
606606
# ZIP64 extension (large files and/or large archives)
607607
try:
608608
if self.file_size in (0xFFFF_FFFF_FFFF_FFFF, 0xFFFF_FFFF):
609609
field = "File size"
610-
self.file_size, = unpack('<Q', data[:8])
611-
data = data[8:]
610+
self.file_size, = unpack_from('<Q', extra, pos)
611+
pos += 8
612612
if self.compress_size == 0xFFFF_FFFF:
613613
field = "Compress size"
614-
self.compress_size, = unpack('<Q', data[:8])
615-
data = data[8:]
614+
self.compress_size, = unpack_from('<Q', extra, pos)
615+
pos += 8
616616
if self.header_offset == 0xFFFF_FFFF:
617617
field = "Header offset"
618-
self.header_offset, = unpack('<Q', data[:8])
618+
self.header_offset, = unpack_from('<Q', extra, pos)
619619
except struct.error:
620620
raise BadZipFile(f"Corrupt zip64 extra field. "
621621
f"{field} not found.") from None
622622
elif tp == 0x7075:
623-
data = extra[4:]
624623
# Unicode Path Extra Field
625624
try:
626-
up_version, up_name_crc = unpack('<BL', data[:5])
625+
up_version, up_name_crc = unpack_from('<BL', extra, pos)
627626
if up_version == 1 and up_name_crc == filename_crc:
628-
up_unicode_name = data[5:].decode('utf-8')
627+
up_unicode_name = extra[pos+5:].decode('utf-8')
629628
if up_unicode_name:
630629
self.filename = _sanitize_filename(up_unicode_name)
631630
else:

0 commit comments

Comments
 (0)