From d3c28e8ca40f7f698f2e8e6fff9e7463c5e10609 Mon Sep 17 00:00:00 2001 From: Danny Lin Date: Wed, 24 Jun 2026 18:27:42 +0800 Subject: [PATCH] gh-51067: Extract `_read_local_file_header()` as a module-level function Move the duplicate logic for reading and validating local file headers from `ZipFile.open()` and multiple `_Repacker` methods into a single shared function. This establishes a single source of truth to ensure behavioral consistency and prevents redundant code. --- Lib/zipfile/__init__.py | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/Lib/zipfile/__init__.py b/Lib/zipfile/__init__.py index 084a47518a935c..418933a2e8d9e8 100644 --- a/Lib/zipfile/__init__.py +++ b/Lib/zipfile/__init__.py @@ -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 = '