Skip to content

Commit 2b3ea68

Browse files
authored
gh-51067: Refactor duplicated logic in zipfile to _read_local_file_header helper (#152139)
1 parent a580029 commit 2b3ea68

1 file changed

Lines changed: 12 additions & 17 deletions

File tree

Lib/zipfile/__init__.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

422431
class 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

Comments
 (0)