@@ -2415,7 +2415,36 @@ def test_decompress_without_3rd_party_library(self):
2415
2415
self .assertRaises (RuntimeError , zf .extract , 'a.txt' )
2416
2416
2417
2417
@requires_zlib ()
2418
- def test_full_overlap (self ):
2418
+ def test_full_overlap_different_names (self ):
2419
+ data = (
2420
+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2421
+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 b\xed '
2422
+ b'\xc0 \x81 \x08 \x00 \x00 \x00 \xc0 0\xd6 \xfb K\\ d\x0b `P'
2423
+ b'K\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 '
2424
+ b'\x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 '
2425
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 aPK'
2426
+ b'\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2427
+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 \x00 '
2428
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 bPK\x05 '
2429
+ b'\x06 \x00 \x00 \x00 \x00 \x02 \x00 \x02 \x00 ^\x00 \x00 \x00 /\x00 \x00 '
2430
+ b'\x00 \x00 \x00 '
2431
+ )
2432
+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2433
+ self .assertEqual (zipf .namelist (), ['a' , 'b' ])
2434
+ zi = zipf .getinfo ('a' )
2435
+ self .assertEqual (zi .header_offset , 0 )
2436
+ self .assertEqual (zi .compress_size , 16 )
2437
+ self .assertEqual (zi .file_size , 1033 )
2438
+ zi = zipf .getinfo ('b' )
2439
+ self .assertEqual (zi .header_offset , 0 )
2440
+ self .assertEqual (zi .compress_size , 16 )
2441
+ self .assertEqual (zi .file_size , 1033 )
2442
+ self .assertEqual (len (zipf .read ('b' )), 1033 )
2443
+ with self .assertRaisesRegex (zipfile .BadZipFile , 'File name.*differ' ):
2444
+ zipf .read ('a' )
2445
+
2446
+ @requires_zlib ()
2447
+ def test_full_overlap_different_names2 (self ):
2419
2448
data = (
2420
2449
b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2421
2450
b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 a\xed '
@@ -2439,9 +2468,43 @@ def test_full_overlap(self):
2439
2468
self .assertEqual (zi .header_offset , 0 )
2440
2469
self .assertEqual (zi .compress_size , 16 )
2441
2470
self .assertEqual (zi .file_size , 1033 )
2442
- self .assertEqual (len (zipf .read ('a' )), 1033 )
2443
2471
with self .assertRaisesRegex (zipfile .BadZipFile , 'File name.*differ' ):
2444
2472
zipf .read ('b' )
2473
+ with self .assertWarnsRegex (UserWarning , 'Overlapped entries' ) as cm :
2474
+ self .assertEqual (len (zipf .read ('a' )), 1033 )
2475
+ self .assertEqual (cm .filename , __file__ )
2476
+
2477
+ @requires_zlib ()
2478
+ def test_full_overlap_same_name (self ):
2479
+ data = (
2480
+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2481
+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 a\xed '
2482
+ b'\xc0 \x81 \x08 \x00 \x00 \x00 \xc0 0\xd6 \xfb K\\ d\x0b `P'
2483
+ b'K\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 '
2484
+ b'\x1e 8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 '
2485
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 aPK'
2486
+ b'\x01 \x02 \x14 \x00 \x14 \x00 \x00 \x00 \x08 \x00 \xa0 lH\x05 \xe2 \x1e '
2487
+ b'8\xbb \x10 \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 \x00 \x00 '
2488
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 aPK\x05 '
2489
+ b'\x06 \x00 \x00 \x00 \x00 \x02 \x00 \x02 \x00 ^\x00 \x00 \x00 /\x00 \x00 '
2490
+ b'\x00 \x00 \x00 '
2491
+ )
2492
+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2493
+ self .assertEqual (zipf .namelist (), ['a' , 'a' ])
2494
+ self .assertEqual (len (zipf .infolist ()), 2 )
2495
+ zi = zipf .getinfo ('a' )
2496
+ self .assertEqual (zi .header_offset , 0 )
2497
+ self .assertEqual (zi .compress_size , 16 )
2498
+ self .assertEqual (zi .file_size , 1033 )
2499
+ self .assertEqual (len (zipf .read ('a' )), 1033 )
2500
+ self .assertEqual (len (zipf .read (zi )), 1033 )
2501
+ self .assertEqual (len (zipf .read (zipf .infolist ()[1 ])), 1033 )
2502
+ with self .assertWarnsRegex (UserWarning , 'Overlapped entries' ) as cm :
2503
+ self .assertEqual (len (zipf .read (zipf .infolist ()[0 ])), 1033 )
2504
+ self .assertEqual (cm .filename , __file__ )
2505
+ with self .assertWarnsRegex (UserWarning , 'Overlapped entries' ) as cm :
2506
+ zipf .open (zipf .infolist ()[0 ]).close ()
2507
+ self .assertEqual (cm .filename , __file__ )
2445
2508
2446
2509
@requires_zlib ()
2447
2510
def test_quoted_overlap (self ):
@@ -2474,6 +2537,47 @@ def test_quoted_overlap(self):
2474
2537
zipf .read ('a' )
2475
2538
self .assertEqual (len (zipf .read ('b' )), 1033 )
2476
2539
2540
+ @requires_zlib ()
2541
+ def test_overlap_with_central_dir (self ):
2542
+ data = (
2543
+ b'PK\x01 \x02 \x14 \x03 \x14 \x00 \x00 \x00 \x08 \x00 G_|Z'
2544
+ b'\xe2 \x1e 8\xbb \x0b \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 '
2545
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \xb4 \x81 \x00 \x00 \x00 \x00 aP'
2546
+ b'K\x05 \x06 \x00 \x00 \x00 \x00 \x01 \x00 \x01 \x00 /\x00 \x00 \x00 \x00 '
2547
+ b'\x00 \x00 \x00 \x00 \x00 '
2548
+ )
2549
+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2550
+ self .assertEqual (zipf .namelist (), ['a' ])
2551
+ self .assertEqual (len (zipf .infolist ()), 1 )
2552
+ zi = zipf .getinfo ('a' )
2553
+ self .assertEqual (zi .header_offset , 0 )
2554
+ self .assertEqual (zi .compress_size , 11 )
2555
+ self .assertEqual (zi .file_size , 1033 )
2556
+ with self .assertRaisesRegex (zipfile .BadZipFile , 'Bad magic number' ):
2557
+ zipf .read ('a' )
2558
+
2559
+ @requires_zlib ()
2560
+ def test_overlap_with_archive_comment (self ):
2561
+ data = (
2562
+ b'PK\x01 \x02 \x14 \x03 \x14 \x00 \x00 \x00 \x08 \x00 G_|Z'
2563
+ b'\xe2 \x1e 8\xbb \x0b \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 '
2564
+ b'\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \xb4 \x81 E\x00 \x00 \x00 aP'
2565
+ b'K\x05 \x06 \x00 \x00 \x00 \x00 \x01 \x00 \x01 \x00 /\x00 \x00 \x00 \x00 '
2566
+ b'\x00 \x00 \x00 *\x00 '
2567
+ b'PK\x03 \x04 \x14 \x00 \x00 \x00 \x08 \x00 G_|Z\xe2 \x1e '
2568
+ b'8\xbb \x0b \x00 \x00 \x00 \t \x04 \x00 \x00 \x01 \x00 \x00 \x00 aK'
2569
+ b'L\x1c \x05 \xa3 `\x14 \x8c x\x00 \x00 '
2570
+ )
2571
+ with zipfile .ZipFile (io .BytesIO (data ), 'r' ) as zipf :
2572
+ self .assertEqual (zipf .namelist (), ['a' ])
2573
+ self .assertEqual (len (zipf .infolist ()), 1 )
2574
+ zi = zipf .getinfo ('a' )
2575
+ self .assertEqual (zi .header_offset , 69 )
2576
+ self .assertEqual (zi .compress_size , 11 )
2577
+ self .assertEqual (zi .file_size , 1033 )
2578
+ with self .assertRaisesRegex (zipfile .BadZipFile , 'Overlapped entries' ):
2579
+ zipf .read ('a' )
2580
+
2477
2581
def tearDown (self ):
2478
2582
unlink (TESTFN )
2479
2583
unlink (TESTFN2 )
0 commit comments