https://github.com/python/cpython/commit/2b3ea68cebb99928bcf01263b531239e313a207c
commit: 2b3ea68cebb99928bcf01263b531239e313a207c
branch: main
author: Danny Lin <[email protected]>
committer: StanFromIreland <[email protected]>
date: 2026-06-25T12:58:28+01:00
summary:

gh-51067: Refactor duplicated logic in `zipfile` to `_read_local_file_header` 
helper (#152139)

files:
M Lib/zipfile/__init__.py

diff --git a/Lib/zipfile/__init__.py b/Lib/zipfile/__init__.py
index 084a47518a935cc..418933a2e8d9e87 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 = '<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]:

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to