@@ -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