mirror of
https://github.com/python/cpython.git
synced 2026-06-28 11:50:50 +00:00
gh-51067: Refactor duplicated logic in zipfile to _read_local_file_header helper (#152139)
This commit is contained in:
parent
a580029f11
commit
2b3ea68ceb
1 changed files with 12 additions and 17 deletions
|
|
@ -418,6 +418,15 @@ def _sanitize_filename(filename):
|
|||
filename = filename.replace(os.altsep, "/")
|
||||
return filename
|
||||
|
||||
def _read_local_file_header(fp):
|
||||
fheader = fp.read(sizeFileHeader)
|
||||
if len(fheader) != sizeFileHeader:
|
||||
raise BadZipFile("Truncated file header")
|
||||
fheader = struct.unpack(structFileHeader, fheader)
|
||||
if fheader[_FH_SIGNATURE] != stringFileHeader:
|
||||
raise BadZipFile("Bad magic number for file header")
|
||||
return fheader
|
||||
|
||||
|
||||
class ZipInfo:
|
||||
"""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
|
|||
def _validate_local_file_entry(self, fp, offset, end_offset):
|
||||
fp.seek(offset)
|
||||
try:
|
||||
fheader = self._read_local_file_header(fp)
|
||||
fheader = _read_local_file_header(fp)
|
||||
except BadZipFile:
|
||||
return None
|
||||
|
||||
|
|
@ -1714,15 +1723,6 @@ def _validate_local_file_entry(self, fp, offset, end_offset):
|
|||
|
||||
return entry_size
|
||||
|
||||
def _read_local_file_header(self, fp):
|
||||
fheader = fp.read(sizeFileHeader)
|
||||
if len(fheader) != sizeFileHeader:
|
||||
raise BadZipFile("Truncated file header")
|
||||
fheader = struct.unpack(structFileHeader, fheader)
|
||||
if fheader[_FH_SIGNATURE] != stringFileHeader:
|
||||
raise BadZipFile("Bad magic number for file header")
|
||||
return fheader
|
||||
|
||||
def _scan_data_descriptor(self, fp, offset, end_offset, zip64):
|
||||
dd_fmt = '<LLQQ' if zip64 else '<LLLL'
|
||||
dd_size = struct.calcsize(dd_fmt)
|
||||
|
|
@ -1825,7 +1825,7 @@ def _trace_compressed_block_end(self, fp, offset, end_offset, decompressor,
|
|||
|
||||
def _calc_local_file_entry_size(self, fp, zinfo):
|
||||
fp.seek(zinfo.header_offset)
|
||||
fheader = self._read_local_file_header(fp)
|
||||
fheader = _read_local_file_header(fp)
|
||||
|
||||
if zinfo.flag_bits & _MASK_USE_DATA_DESCRIPTOR:
|
||||
zip64 = fheader[_FH_UNCOMPRESSED_SIZE] == 0xffffffff
|
||||
|
|
@ -2215,12 +2215,7 @@ def open(self, name, mode="r", pwd=None, *, force_zip64=False):
|
|||
self._fpclose, self._lock, lambda: self._writing)
|
||||
try:
|
||||
# Skip the file header:
|
||||
fheader = zef_file.read(sizeFileHeader)
|
||||
if len(fheader) != sizeFileHeader:
|
||||
raise BadZipFile("Truncated file header")
|
||||
fheader = struct.unpack(structFileHeader, fheader)
|
||||
if fheader[_FH_SIGNATURE] != stringFileHeader:
|
||||
raise BadZipFile("Bad magic number for file header")
|
||||
fheader = _read_local_file_header(zef_file)
|
||||
|
||||
fname = zef_file.read(fheader[_FH_FILENAME_LENGTH])
|
||||
if fheader[_FH_EXTRA_FIELD_LENGTH]:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue