@@ -418,6 +418,15 @@ def _sanitize_filename(filename):
418418 filename = filename .replace (os .altsep , "/" )
419419 return filename
420420
421+ def _read_local_file_header (fp ):
422+ fheader = fp .read (sizeFileHeader )
423+ if len (fheader ) != sizeFileHeader :
424+ raise BadZipFile ("Truncated file header" )
425+ fheader = struct .unpack (structFileHeader , fheader )
426+ if fheader [_FH_SIGNATURE ] != stringFileHeader :
427+ raise BadZipFile ("Bad magic number for file header" )
428+ return fheader
429+
421430
422431class ZipInfo :
423432 """Class with attributes describing each file in the ZIP archive."""
@@ -1648,7 +1657,7 @@ def _validate_local_file_entry_sequence(self, fp, start_offset, end_offset, chec
16481657 def _validate_local_file_entry (self , fp , offset , end_offset ):
16491658 fp .seek (offset )
16501659 try :
1651- fheader = self . _read_local_file_header (fp )
1660+ fheader = _read_local_file_header (fp )
16521661 except BadZipFile :
16531662 return None
16541663
@@ -1714,15 +1723,6 @@ def _validate_local_file_entry(self, fp, offset, end_offset):
17141723
17151724 return entry_size
17161725
1717- def _read_local_file_header (self , fp ):
1718- fheader = fp .read (sizeFileHeader )
1719- if len (fheader ) != sizeFileHeader :
1720- raise BadZipFile ("Truncated file header" )
1721- fheader = struct .unpack (structFileHeader , fheader )
1722- if fheader [_FH_SIGNATURE ] != stringFileHeader :
1723- raise BadZipFile ("Bad magic number for file header" )
1724- return fheader
1725-
17261726 def _scan_data_descriptor (self , fp , offset , end_offset , zip64 ):
17271727 dd_fmt = '<LLQQ' if zip64 else '<LLLL'
17281728 dd_size = struct .calcsize (dd_fmt )
@@ -1825,7 +1825,7 @@ def _trace_compressed_block_end(self, fp, offset, end_offset, decompressor,
18251825
18261826 def _calc_local_file_entry_size (self , fp , zinfo ):
18271827 fp .seek (zinfo .header_offset )
1828- fheader = self . _read_local_file_header (fp )
1828+ fheader = _read_local_file_header (fp )
18291829
18301830 if zinfo .flag_bits & _MASK_USE_DATA_DESCRIPTOR :
18311831 zip64 = fheader [_FH_UNCOMPRESSED_SIZE ] == 0xffffffff
@@ -2215,12 +2215,7 @@ def open(self, name, mode="r", pwd=None, *, force_zip64=False):
22152215 self ._fpclose , self ._lock , lambda : self ._writing )
22162216 try :
22172217 # Skip the file header:
2218- fheader = zef_file .read (sizeFileHeader )
2219- if len (fheader ) != sizeFileHeader :
2220- raise BadZipFile ("Truncated file header" )
2221- fheader = struct .unpack (structFileHeader , fheader )
2222- if fheader [_FH_SIGNATURE ] != stringFileHeader :
2223- raise BadZipFile ("Bad magic number for file header" )
2218+ fheader = _read_local_file_header (zef_file )
22242219
22252220 fname = zef_file .read (fheader [_FH_FILENAME_LENGTH ])
22262221 if fheader [_FH_EXTRA_FIELD_LENGTH ]:
0 commit comments