|
12 | 12 |
|
13 | 13 | from tempfile import TemporaryFile
|
14 | 14 | from random import randint, random, getrandbits
|
| 15 | +from unittest import mock |
15 | 16 |
|
16 | 17 | from test.support import script_helper
|
17 | 18 | from test.support import (TESTFN, findfile, unlink, rmtree, temp_dir, temp_cwd,
|
@@ -1610,6 +1611,66 @@ def test_open_conflicting_handles(self):
|
1610 | 1611 | self.assertEqual(zipf.read('baz'), msg3)
|
1611 | 1612 | self.assertEqual(zipf.namelist(), ['foo', 'bar', 'baz'])
|
1612 | 1613 |
|
| 1614 | + @requires_zlib |
| 1615 | + def test_full_overlap(self): |
| 1616 | + data = ( |
| 1617 | + b'PK\x03\x04\x14\x00\x00\x00\x08\x00\xa0lH\x05\xe2\x1e' |
| 1618 | + b'8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00a\xed' |
| 1619 | + b'\xc0\x81\x08\x00\x00\x00\xc00\xd6\xfbK\\d\x0b`P' |
| 1620 | + b'K\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xa0lH\x05\xe2' |
| 1621 | + b'\x1e8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00\x00' |
| 1622 | + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00aPK' |
| 1623 | + b'\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xa0lH\x05\xe2\x1e' |
| 1624 | + b'8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00\x00\x00' |
| 1625 | + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00bPK\x05' |
| 1626 | + b'\x06\x00\x00\x00\x00\x02\x00\x02\x00^\x00\x00\x00/\x00\x00' |
| 1627 | + b'\x00\x00\x00' |
| 1628 | + ) |
| 1629 | + with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf: |
| 1630 | + self.assertEqual(zipf.namelist(), ['a', 'b']) |
| 1631 | + zi = zipf.getinfo('a') |
| 1632 | + self.assertEqual(zi.header_offset, 0) |
| 1633 | + self.assertEqual(zi.compress_size, 16) |
| 1634 | + self.assertEqual(zi.file_size, 1033) |
| 1635 | + zi = zipf.getinfo('b') |
| 1636 | + self.assertEqual(zi.header_offset, 0) |
| 1637 | + self.assertEqual(zi.compress_size, 16) |
| 1638 | + self.assertEqual(zi.file_size, 1033) |
| 1639 | + self.assertEqual(len(zipf.read('a')), 1033) |
| 1640 | + with self.assertRaisesRegex(zipfile.BadZipFile, 'File name.*differ'): |
| 1641 | + zipf.read('b') |
| 1642 | + |
| 1643 | + @requires_zlib |
| 1644 | + def test_quoted_overlap(self): |
| 1645 | + data = ( |
| 1646 | + b'PK\x03\x04\x14\x00\x00\x00\x08\x00\xa0lH\x05Y\xfc' |
| 1647 | + b'8\x044\x00\x00\x00(\x04\x00\x00\x01\x00\x00\x00a\x00' |
| 1648 | + b'\x1f\x00\xe0\xffPK\x03\x04\x14\x00\x00\x00\x08\x00\xa0l' |
| 1649 | + b'H\x05\xe2\x1e8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00' |
| 1650 | + b'\x00\x00b\xed\xc0\x81\x08\x00\x00\x00\xc00\xd6\xfbK\\' |
| 1651 | + b'd\x0b`PK\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xa0' |
| 1652 | + b'lH\x05Y\xfc8\x044\x00\x00\x00(\x04\x00\x00\x01' |
| 1653 | + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |
| 1654 | + b'\x00aPK\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xa0l' |
| 1655 | + b'H\x05\xe2\x1e8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00' |
| 1656 | + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00' |
| 1657 | + b'bPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00^\x00\x00' |
| 1658 | + b'\x00S\x00\x00\x00\x00\x00' |
| 1659 | + ) |
| 1660 | + with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf: |
| 1661 | + self.assertEqual(zipf.namelist(), ['a', 'b']) |
| 1662 | + zi = zipf.getinfo('a') |
| 1663 | + self.assertEqual(zi.header_offset, 0) |
| 1664 | + self.assertEqual(zi.compress_size, 52) |
| 1665 | + self.assertEqual(zi.file_size, 1064) |
| 1666 | + zi = zipf.getinfo('b') |
| 1667 | + self.assertEqual(zi.header_offset, 36) |
| 1668 | + self.assertEqual(zi.compress_size, 16) |
| 1669 | + self.assertEqual(zi.file_size, 1033) |
| 1670 | + with self.assertRaisesRegex(zipfile.BadZipFile, 'Overlapped entries'): |
| 1671 | + zipf.read('a') |
| 1672 | + self.assertEqual(len(zipf.read('b')), 1033) |
| 1673 | + |
1613 | 1674 | def tearDown(self):
|
1614 | 1675 | unlink(TESTFN)
|
1615 | 1676 | unlink(TESTFN2)
|
|
0 commit comments