@@ -2351,7 +2351,36 @@ def test_decompress_without_3rd_party_library(self):
23512351 self .assertRaises (RuntimeError , zf .extract , 'a.txt' )
23522352
23532353 @requires_zlib ()
2354- def test_full_overlap (self ):
2354+ def test_full_overlap_different_names (self ):
2355+ data = (
2356+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2357+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 b\xed '
2358+ b'\xc0 \x81 \x08 \x00 \x00 \x00 \xc0 0\xd6 \xfb K\\ d\x0b `P'
2359+ b'K\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 '
2360+ b'\x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 '
2361+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 aPK'
2362+ b'\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2363+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 \x00 '
2364+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 bPK\x05 '
2365+ b'\x06 \x00 \x00 \x00 \x00 \x02 \x00 \x02 \x00 ^\x00 \x00 \x00 /\x00 \x00 '
2366+ b'\x00 \x00 \x00 '
2367+ )
2368+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2369+ self .assertEqual (zipf .namelist (), ['a' , 'b' ])
2370+ zi = zipf .getinfo ('a' )
2371+ self .assertEqual (zi .header_offset , 0 )
2372+ self .assertEqual (zi .compress_size , 16 )
2373+ self .assertEqual (zi .file_size , 1033 )
2374+ zi = zipf .getinfo ('b' )
2375+ self .assertEqual (zi .header_offset , 0 )
2376+ self .assertEqual (zi .compress_size , 16 )
2377+ self .assertEqual (zi .file_size , 1033 )
2378+ self .assertEqual (len (zipf .read ('b' )), 1033 )
2379+ with self .assertRaisesRegex (zipfile .BadZipFile , 'File name.*differ' ):
2380+ zipf .read ('a' )
2381+
2382+ @requires_zlib ()
2383+ def test_full_overlap_different_names2 (self ):
23552384 data = (
23562385 b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
23572386 b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 a\xed '
@@ -2375,9 +2404,43 @@ def test_full_overlap(self):
23752404 self .assertEqual (zi .header_offset , 0 )
23762405 self .assertEqual (zi .compress_size , 16 )
23772406 self .assertEqual (zi .file_size , 1033 )
2378- self .assertEqual (len (zipf .read ('a' )), 1033 )
23792407 with self .assertRaisesRegex (zipfile .BadZipFile , 'File name.*differ' ):
23802408 zipf .read ('b' )
2409+ with self .assertWarnsRegex (UserWarning , 'Overlapped entries' ) as cm :
2410+ self .assertEqual (len (zipf .read ('a' )), 1033 )
2411+ self .assertEqual (cm .filename , __file__ )
2412+
2413+ @requires_zlib ()
2414+ def test_full_overlap_same_name (self ):
2415+ data = (
2416+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2417+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 a\xed '
2418+ b'\xc0 \x81 \x08 \x00 \x00 \x00 \xc0 0\xd6 \xfb K\\ d\x0b `P'
2419+ b'K\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 '
2420+ b'\x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 '
2421+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 aPK'
2422+ b'\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2423+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 \x00 '
2424+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 aPK\x05 '
2425+ b'\x06 \x00 \x00 \x00 \x00 \x02 \x00 \x02 \x00 ^\x00 \x00 \x00 /\x00 \x00 '
2426+ b'\x00 \x00 \x00 '
2427+ )
2428+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2429+ self .assertEqual (zipf .namelist (), ['a' , 'a' ])
2430+ self .assertEqual (len (zipf .infolist ()), 2 )
2431+ zi = zipf .getinfo ('a' )
2432+ self .assertEqual (zi .header_offset , 0 )
2433+ self .assertEqual (zi .compress_size , 16 )
2434+ self .assertEqual (zi .file_size , 1033 )
2435+ self .assertEqual (len (zipf .read ('a' )), 1033 )
2436+ self .assertEqual (len (zipf .read (zi )), 1033 )
2437+ self .assertEqual (len (zipf .read (zipf .infolist ()[1 ])), 1033 )
2438+ with self .assertWarnsRegex (UserWarning , 'Overlapped entries' ) as cm :
2439+ self .assertEqual (len (zipf .read (zipf .infolist ()[0 ])), 1033 )
2440+ self .assertEqual (cm .filename , __file__ )
2441+ with self .assertWarnsRegex (UserWarning , 'Overlapped entries' ) as cm :
2442+ zipf .open (zipf .infolist ()[0 ]).close ()
2443+ self .assertEqual (cm .filename , __file__ )
23812444
23822445 @requires_zlib ()
23832446 def test_quoted_overlap (self ):
@@ -2410,6 +2473,47 @@ def test_quoted_overlap(self):
24102473 zipf .read ('a' )
24112474 self .assertEqual (len (zipf .read ('b' )), 1033 )
24122475
2476+ @requires_zlib ()
2477+ def test_overlap_with_central_dir (self ):
2478+ data = (
2479+ b'PK\x01 \x02 \x14 \x03 \x14 \x00 \x00 \x00 \x08 \x00 G_|Z'
2480+ b'\xe2 \x1e 8\xbb \x0b \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 '
2481+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \xb4 \x81 \x00 \x00 \x00 \x00 aP'
2482+ b'K\x05 \x06 \x00 \x00 \x00 \x00 \x01 \x00 \x01 \x00 /\x00 \x00 \x00 \x00 '
2483+ b'\x00 \x00 \x00 \x00 \x00 '
2484+ )
2485+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2486+ self .assertEqual (zipf .namelist (), ['a' ])
2487+ self .assertEqual (len (zipf .infolist ()), 1 )
2488+ zi = zipf .getinfo ('a' )
2489+ self .assertEqual (zi .header_offset , 0 )
2490+ self .assertEqual (zi .compress_size , 11 )
2491+ self .assertEqual (zi .file_size , 1033 )
2492+ with self .assertRaisesRegex (zipfile .BadZipFile , 'Bad magic number' ):
2493+ zipf .read ('a' )
2494+
2495+ @requires_zlib ()
2496+ def test_overlap_with_archive_comment (self ):
2497+ data = (
2498+ b'PK\x01 \x02 \x14 \x03 \x14 \x00 \x00 \x00 \x08 \x00 G_|Z'
2499+ b'\xe2 \x1e 8\xbb \x0b \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 '
2500+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \xb4 \x81 E\x00 \x00 \x00 aP'
2501+ b'K\x05 \x06 \x00 \x00 \x00 \x00 \x01 \x00 \x01 \x00 /\x00 \x00 \x00 \x00 '
2502+ b'\x00 \x00 \x00 *\x00 '
2503+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 G_|Z\xe2 \x1e '
2504+ b'8\xbb \x0b \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 aK'
2505+ b'L\x1c \x05 \xa3 `\x14 \x8c x\x00 \x00 '
2506+ )
2507+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2508+ self .assertEqual (zipf .namelist (), ['a' ])
2509+ self .assertEqual (len (zipf .infolist ()), 1 )
2510+ zi = zipf .getinfo ('a' )
2511+ self .assertEqual (zi .header_offset , 69 )
2512+ self .assertEqual (zi .compress_size , 11 )
2513+ self .assertEqual (zi .file_size , 1033 )
2514+ with self .assertRaisesRegex (zipfile .BadZipFile , 'Overlapped entries' ):
2515+ zipf .read ('a' )
2516+
24132517 def tearDown (self ):
24142518 unlink (TESTFN )
24152519 unlink (TESTFN2 )
0 commit comments