@@ -2351,7 +2351,36 @@ def test_decompress_without_3rd_party_library(self):
2351
2351
self .assertRaises (RuntimeError ,zf .extract ,'a.txt' )
2352
2352
2353
2353
@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 ):
2355
2384
data = (
2356
2385
b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2357
2386
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):
2375
2404
self .assertEqual (zi .header_offset ,0 )
2376
2405
self .assertEqual (zi .compress_size ,16 )
2377
2406
self .assertEqual (zi .file_size ,1033 )
2378
- self .assertEqual (len (zipf .read ('a' )),1033 )
2379
2407
with self .assertRaisesRegex (zipfile .BadZipFile ,'File name.*differ' ):
2380
2408
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__ )
2381
2444
2382
2445
@requires_zlib ()
2383
2446
def test_quoted_overlap (self ):
@@ -2410,6 +2473,47 @@ def test_quoted_overlap(self):
2410
2473
zipf .read ('a' )
2411
2474
self .assertEqual (len (zipf .read ('b' )),1033 )
2412
2475
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
+
2413
2517
def tearDown (self ):
2414
2518
unlink (TESTFN )
2415
2519
unlink (TESTFN2 )