@@ -1998,6 +1998,66 @@ def test_decompress_without_3rd_party_library(self):
1998
1998
with zipfile .ZipFile (zip_file ) as zf :
1999
1999
self .assertRaises (RuntimeError , zf .extract , 'a.txt' )
2000
2000
2001
+ @requires_zlib ()
2002
+ def test_full_overlap (self ):
2003
+ data = (
2004
+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2005
+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 a\xed '
2006
+ b'\xc0 \x81 \x08 \x00 \x00 \x00 \xc0 0\xd6 \xfb K\\ d\x0b `P'
2007
+ b'K\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 '
2008
+ b'\x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 '
2009
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 aPK'
2010
+ b'\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2011
+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 \x00 '
2012
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 bPK\x05 '
2013
+ b'\x06 \x00 \x00 \x00 \x00 \x02 \x00 \x02 \x00 ^\x00 \x00 \x00 /\x00 \x00 '
2014
+ b'\x00 \x00 \x00 '
2015
+ )
2016
+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2017
+ self .assertEqual (zipf .namelist (), ['a' , 'b' ])
2018
+ zi = zipf .getinfo ('a' )
2019
+ self .assertEqual (zi .header_offset , 0 )
2020
+ self .assertEqual (zi .compress_size , 16 )
2021
+ self .assertEqual (zi .file_size , 1033 )
2022
+ zi = zipf .getinfo ('b' )
2023
+ self .assertEqual (zi .header_offset , 0 )
2024
+ self .assertEqual (zi .compress_size , 16 )
2025
+ self .assertEqual (zi .file_size , 1033 )
2026
+ self .assertEqual (len (zipf .read ('a' )), 1033 )
2027
+ with self .assertRaisesRegex (zipfile .BadZipFile , 'File name.*differ' ):
2028
+ zipf .read ('b' )
2029
+
2030
+ @requires_zlib ()
2031
+ def test_quoted_overlap (self ):
2032
+ data = (
2033
+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 Y\xfc '
2034
+ b'8\x04 4\x00 \x00 \x00 (\x04 \x00 \x00 \x01 \x00 \x00 \x00 a\x00 '
2035
+ b'\x1f \x00 \xe0 \xff PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 l'
2036
+ b'H\x05 \xe2 \x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 '
2037
+ b'\x00 \x00 b\xed \xc0 \x81 \x08 \x00 \x00 \x00 \xc0 0\xd6 \xfb K\\ '
2038
+ b'd\x0b `PK\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 '
2039
+ b'lH\x05 Y\xfc 8\x04 4\x00 \x00 \x00 (\x04 \x00 \x00 \x01 '
2040
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 '
2041
+ b'\x00 aPK\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 l'
2042
+ b'H\x05 \xe2 \x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 '
2043
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 $\x00 \x00 \x00 '
2044
+ b'bPK\x05 \x06 \x00 \x00 \x00 \x00 \x02 \x00 \x02 \x00 ^\x00 \x00 '
2045
+ b'\x00 S\x00 \x00 \x00 \x00 \x00 '
2046
+ )
2047
+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2048
+ self .assertEqual (zipf .namelist (), ['a' , 'b' ])
2049
+ zi = zipf .getinfo ('a' )
2050
+ self .assertEqual (zi .header_offset , 0 )
2051
+ self .assertEqual (zi .compress_size , 52 )
2052
+ self .assertEqual (zi .file_size , 1064 )
2053
+ zi = zipf .getinfo ('b' )
2054
+ self .assertEqual (zi .header_offset , 36 )
2055
+ self .assertEqual (zi .compress_size , 16 )
2056
+ self .assertEqual (zi .file_size , 1033 )
2057
+ with self .assertRaisesRegex (zipfile .BadZipFile , 'Overlapped entries' ):
2058
+ zipf .read ('a' )
2059
+ self .assertEqual (len (zipf .read ('b' )), 1033 )
2060
+
2001
2061
def tearDown (self ):
2002
2062
unlink (TESTFN )
2003
2063
unlink (TESTFN2 )
0 commit comments