@@ -2045,6 +2045,66 @@ def test_decompress_without_3rd_party_library(self):
20452045 with zipfile .ZipFile (zip_file ) as zf :
20462046 self .assertRaises (RuntimeError , zf .extract , 'a.txt' )
20472047
2048+ @requires_zlib ()
2049+ def test_full_overlap (self ):
2050+ data = (
2051+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2052+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 a\xed '
2053+ b'\xc0 \x81 \x08 \x00 \x00 \x00 \xc0 0\xd6 \xfb K\\ d\x0b `P'
2054+ b'K\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 '
2055+ b'\x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 '
2056+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 aPK'
2057+ b'\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2058+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 \x00 '
2059+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 bPK\x05 '
2060+ b'\x06 \x00 \x00 \x00 \x00 \x02 \x00 \x02 \x00 ^\x00 \x00 \x00 /\x00 \x00 '
2061+ b'\x00 \x00 \x00 '
2062+ )
2063+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2064+ self .assertEqual (zipf .namelist (), ['a' , 'b' ])
2065+ zi = zipf .getinfo ('a' )
2066+ self .assertEqual (zi .header_offset , 0 )
2067+ self .assertEqual (zi .compress_size , 16 )
2068+ self .assertEqual (zi .file_size , 1033 )
2069+ zi = zipf .getinfo ('b' )
2070+ self .assertEqual (zi .header_offset , 0 )
2071+ self .assertEqual (zi .compress_size , 16 )
2072+ self .assertEqual (zi .file_size , 1033 )
2073+ self .assertEqual (len (zipf .read ('a' )), 1033 )
2074+ with self .assertRaisesRegex (zipfile .BadZipFile , 'File name.*differ' ):
2075+ zipf .read ('b' )
2076+
2077+ @requires_zlib ()
2078+ def test_quoted_overlap (self ):
2079+ data = (
2080+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 Y\xfc '
2081+ b'8\x04 4\x00 \x00 \x00 (\x04 \x00 \x00 \x01 \x00 \x00 \x00 a\x00 '
2082+ b'\x1f \x00 \xe0 \xff PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 l'
2083+ b'H\x05 \xe2 \x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 '
2084+ b'\x00 \x00 b\xed \xc0 \x81 \x08 \x00 \x00 \x00 \xc0 0\xd6 \xfb K\\ '
2085+ b'd\x0b `PK\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 '
2086+ b'lH\x05 Y\xfc 8\x04 4\x00 \x00 \x00 (\x04 \x00 \x00 \x01 '
2087+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 '
2088+ b'\x00 aPK\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 l'
2089+ b'H\x05 \xe2 \x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 '
2090+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 $\x00 \x00 \x00 '
2091+ b'bPK\x05 \x06 \x00 \x00 \x00 \x00 \x02 \x00 \x02 \x00 ^\x00 \x00 '
2092+ b'\x00 S\x00 \x00 \x00 \x00 \x00 '
2093+ )
2094+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2095+ self .assertEqual (zipf .namelist (), ['a' , 'b' ])
2096+ zi = zipf .getinfo ('a' )
2097+ self .assertEqual (zi .header_offset , 0 )
2098+ self .assertEqual (zi .compress_size , 52 )
2099+ self .assertEqual (zi .file_size , 1064 )
2100+ zi = zipf .getinfo ('b' )
2101+ self .assertEqual (zi .header_offset , 36 )
2102+ self .assertEqual (zi .compress_size , 16 )
2103+ self .assertEqual (zi .file_size , 1033 )
2104+ with self .assertRaisesRegex (zipfile .BadZipFile , 'Overlapped entries' ):
2105+ zipf .read ('a' )
2106+ self .assertEqual (len (zipf .read ('b' )), 1033 )
2107+
20482108 def tearDown (self ):
20492109 unlink (TESTFN )
20502110 unlink (TESTFN2 )
0 commit comments