Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 12 additions & 17 deletions Lib/zipfile/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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]:
Expand Down
Loading