Skip to content

Commit c683cf7

Browse files
gh-117779: Fix reading duplicated entries in zipfile by name
1 parent 732670d commit c683cf7

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

Lib/test/test_zipfile/test_core.py

+28
Original file line numberDiff line numberDiff line change
@@ -2445,6 +2445,34 @@ def test_full_overlap(self):
24452445
with self.assertRaisesRegex(zipfile.BadZipFile, 'File name.*differ'):
24462446
zipf.read('b')
24472447

2448+
@requires_zlib()
2449+
def test_full_overlap_same_name(self):
2450+
data = (
2451+
b'PK\x03\x04\x14\x00\x00\x00\x08\x00\xa0lH\x05\xe2\x1e'
2452+
b'8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00a\xed'
2453+
b'\xc0\x81\x08\x00\x00\x00\xc00\xd6\xfbK\\d\x0b`P'
2454+
b'K\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xa0lH\x05\xe2'
2455+
b'\x1e8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00\x00'
2456+
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00aPK'
2457+
b'\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xa0lH\x05\xe2\x1e'
2458+
b'8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00\x00\x00'
2459+
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00aPK\x05'
2460+
b'\x06\x00\x00\x00\x00\x02\x00\x02\x00^\x00\x00\x00/\x00\x00'
2461+
b'\x00\x00\x00'
2462+
)
2463+
with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf:
2464+
self.assertEqual(zipf.namelist(), ['a', 'a'])
2465+
self.assertEqual(len(zipf.infolist()), 2)
2466+
zi = zipf.getinfo('a')
2467+
self.assertEqual(zi.header_offset, 0)
2468+
self.assertEqual(zi.compress_size, 16)
2469+
self.assertEqual(zi.file_size, 1033)
2470+
self.assertEqual(len(zipf.read('a')), 1033)
2471+
self.assertEqual(len(zipf.read(zi)), 1033)
2472+
self.assertEqual(len(zipf.read(zipf.infolist()[1])), 1033)
2473+
with self.assertRaisesRegex(zipfile.BadZipFile, 'Overlapped entries'):
2474+
zipf.read(zipf.infolist()[0])
2475+
24482476
@requires_zlib()
24492477
def test_quoted_overlap(self):
24502478
data = (

Lib/zipfile/__init__.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1545,9 +1545,8 @@ def _RealGetContents(self):
15451545
print("total", total)
15461546

15471547
end_offset = self.start_dir
1548-
for zinfo in sorted(self.filelist,
1549-
key=lambda zinfo: zinfo.header_offset,
1550-
reverse=True):
1548+
for zinfo in reversed(sorted(self.filelist,
1549+
key=lambda zinfo: zinfo.header_offset)):
15511550
zinfo._end_offset = end_offset
15521551
end_offset = zinfo.header_offset
15531552

Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix reading duplicated entries in :mod:`zipfile` by name.

0 commit comments

Comments
 (0)