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