Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3e51cc4

Browse files
committed
Reuse 'concat' handling for is_zipfile
1 parent243b95a commit3e51cc4

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

‎Lib/zipfile/__init__.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,9 @@ def _check_zipfile(fp):
239239
ifendrec[_ECD_ENTRIES_TOTAL]==0andendrec[_ECD_SIZE]==0andendrec[_ECD_OFFSET]==0:
240240
returnTrue# Empty zipfiles are still zipfiles
241241
elifendrec[_ECD_DISK_NUMBER]==endrec[_ECD_DISK_START]:
242-
fp.seek(endrec[_ECD_OFFSET])# Central directory is on the same disk
243-
iffp.tell()==endrec[_ECD_OFFSET]andendrec[_ECD_SIZE]>=sizeCentralDir:
242+
# Central directory is on the same disk
243+
fp.seek(sum(_handle_prepended_data(endrec)))
244+
ifendrec[_ECD_SIZE]>=sizeCentralDir:
244245
data=fp.read(sizeCentralDir)# CD is where we expect it to be
245246
iflen(data)==sizeCentralDir:
246247
centdir=struct.unpack(structCentralDir,data)# CD is the right size
@@ -268,6 +269,22 @@ def is_zipfile(filename):
268269
pass
269270
returnresult
270271

272+
def_handle_prepended_data(endrec,debug=0):
273+
size_cd=endrec[_ECD_SIZE]# bytes in central directory
274+
offset_cd=endrec[_ECD_OFFSET]# offset of central directory
275+
276+
# "concat" is zero, unless zip was concatenated to another file
277+
concat=endrec[_ECD_LOCATION]-size_cd-offset_cd
278+
ifendrec[_ECD_SIGNATURE]==stringEndArchive64:
279+
# If Zip64 extension structures are present, account for them
280+
concat-= (sizeEndCentDir64+sizeEndCentDir64Locator)
281+
282+
ifdebug>2:
283+
inferred=concat+offset_cd
284+
print("given, inferred, offset",offset_cd,inferred,concat)
285+
286+
returnoffset_cd,concat
287+
271288
def_EndRecData64(fpin,offset,endrec):
272289
"""
273290
Read the ZIP64 end-of-archive records and use that to update endrec
@@ -1511,28 +1528,21 @@ def _RealGetContents(self):
15111528
raiseBadZipFile("File is not a zip file")
15121529
ifself.debug>1:
15131530
print(endrec)
1514-
size_cd=endrec[_ECD_SIZE]# bytes in central directory
1515-
offset_cd=endrec[_ECD_OFFSET]# offset of central directory
15161531
self._comment=endrec[_ECD_COMMENT]# archive comment
15171532

1518-
# "concat" is zero, unless zip was concatenated to another file
1519-
concat=endrec[_ECD_LOCATION]-size_cd-offset_cd
1520-
ifendrec[_ECD_SIGNATURE]==stringEndArchive64:
1521-
# If Zip64 extension structures are present, account for them
1522-
concat-= (sizeEndCentDir64+sizeEndCentDir64Locator)
1533+
offset_cd,concat=_handle_prepended_data(endrec,self.debug)
1534+
1535+
# self.start_dir: Position of start of central directory
1536+
self.start_dir=offset_cd+concat
15231537

15241538
# store the offset to the beginning of data for the
15251539
# .data_offset property
15261540
self._data_offset=concat
15271541

1528-
ifself.debug>2:
1529-
inferred=concat+offset_cd
1530-
print("given, inferred, offset",offset_cd,inferred,concat)
1531-
# self.start_dir: Position of start of central directory
1532-
self.start_dir=offset_cd+concat
15331542
ifself.start_dir<0:
15341543
raiseBadZipFile("Bad offset for central directory")
15351544
fp.seek(self.start_dir,0)
1545+
size_cd=endrec[_ECD_SIZE]
15361546
data=fp.read(size_cd)
15371547
fp=io.BytesIO(data)
15381548
total=0

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp