@@ -2584,180 +2584,193 @@ def test_scan_data_descriptor_no_sig(self):
25842584 (0x4ff4f23f , 5 , 5 , 12 ),
25852585 )
25862586
2587+ def test_scan_data_descriptor_no_sig_by_decompression_stored (self ):
2588+ self ._test_scan_data_descriptor_no_sig_by_decompression_invalid (zipfile .ZIP_STORED )
2589+
25872590 @requires_zlib ()
2591+ def test_scan_data_descriptor_no_sig_by_decompression_zlib (self ):
2592+ self ._test_scan_data_descriptor_no_sig_by_decompression (zipfile .ZIP_DEFLATED )
2593+
25882594 @requires_bz2 ()
2595+ def test_scan_data_descriptor_no_sig_by_decompression_bz2 (self ):
2596+ self ._test_scan_data_descriptor_no_sig_by_decompression (zipfile .ZIP_BZIP2 )
2597+
2598+ @requires_lzma ()
2599+ def test_scan_data_descriptor_no_sig_by_decompression_lzma (self ):
2600+ self ._test_scan_data_descriptor_no_sig_by_decompression_invalid (zipfile .ZIP_LZMA )
2601+
25892602 @requires_zstd ()
2590- def test_scan_data_descriptor_no_sig_by_decompression (self ):
2603+ def test_scan_data_descriptor_no_sig_by_decompression_zstd (self ):
2604+ self ._test_scan_data_descriptor_no_sig_by_decompression (zipfile .ZIP_ZSTANDARD )
2605+
2606+ def test_scan_data_descriptor_no_sig_by_decompression_unknown (self ):
2607+ method = 1024 # simulate an unknown method
2608+ self ._test_scan_data_descriptor_no_sig_by_decompression_invalid (method )
2609+
2610+ def _test_scan_data_descriptor_no_sig_by_decompression (self , method ):
25912611 repacker = zipfile ._ZipRepacker ()
25922612
2593- for method in (
2594- zipfile .ZIP_DEFLATED ,
2595- zipfile .ZIP_BZIP2 ,
2596- zipfile .ZIP_ZSTANDARD ,
2597- ):
2598- compressor = zipfile ._get_compressor (method )
2599- with self .subTest (method = method , compressor = compressor ):
2600- comp_bytes = compressor .compress (b'dummy' )
2601- comp_bytes += compressor .flush ()
2602- comp_len = len (comp_bytes )
2603-
2604- # basic
2605- bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 '
2606- self .assertEqual (
2607- repacker ._scan_data_descriptor_no_sig_by_decompression (
2608- io .BytesIO (bytes_ ), 0 , len (bytes_ ), False , method ),
2609- (0x4ff4f23f , comp_len , 5 , 12 ),
2610- )
2613+ compressor = zipfile ._get_compressor (method )
26112614
2612- # return None if insufficient data length
2613- bytes_ = b'\x3f \xf2 \xf4 \x4f \x05 \x00 \x00 \x00 \x05 \x00 \x00 \x00 '
2614- self .assertEqual (
2615- repacker ._scan_data_descriptor_no_sig_by_decompression (
2616- io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 1 , False , method ),
2617- None ,
2618- )
2615+ comp_bytes = compressor .compress (b'dummy' )
2616+ comp_bytes += compressor .flush ()
2617+ comp_len = len (comp_bytes )
26192618
2620- bytes_ = b'\x3f \xf2 \xf4 \x4f \x05 \x00 \x00 \x00 \x05 \x00 \x00 '
2621- self .assertEqual (
2622- repacker ._scan_data_descriptor_no_sig_by_decompression (
2623- io .BytesIO (bytes_ ), 0 , len (bytes_ ) + 1 , False , method ),
2624- None ,
2625- )
2619+ # basic
2620+ bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 '
2621+ self .assertEqual (
2622+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2623+ io .BytesIO (bytes_ ), 0 , len (bytes_ ), False , method ),
2624+ (0x4ff4f23f , comp_len , 5 , 12 ),
2625+ )
26262626
2627- # return None if compressed size not match
2628- bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct . pack ( '<L' , comp_len - 1 ) + b' \x05 \x00 \x00 \x00 '
2629- self .assertEqual (
2630- repacker ._scan_data_descriptor_no_sig_by_decompression (
2631- io .BytesIO (bytes_ ), 0 , len (bytes_ ), False , method ),
2632- None ,
2633- )
2627+ # return None if insufficient data length
2628+ bytes_ = b'\x3f \xf2 \xf4 \x4f \x05 \x00 \x00 \x00 \x05 \x00 \x00 \x00 '
2629+ self .assertEqual (
2630+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2631+ io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 1 , False , method ),
2632+ None ,
2633+ )
26342634
2635- # zip64
2636- bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<Q' , comp_len ) + b'\x05 \x00 \x00 \x00 \x00 \x00 \x00 \x00 '
2637- self .assertEqual (
2638- repacker ._scan_data_descriptor_no_sig_by_decompression (
2639- io .BytesIO (bytes_ ), 0 , len (bytes_ ), True , method ),
2640- (0x4ff4f23f , comp_len , 5 , 20 ),
2641- )
2635+ bytes_ = b'\x3f \xf2 \xf4 \x4f \x05 \x00 \x00 \x00 \x05 \x00 \x00 '
2636+ self .assertEqual (
2637+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2638+ io .BytesIO (bytes_ ), 0 , len (bytes_ ) + 1 , False , method ),
2639+ None ,
2640+ )
26422641
2643- # offset
2644- bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 '
2645- self .assertEqual (
2646- repacker ._scan_data_descriptor_no_sig_by_decompression (
2647- io .BytesIO (bytes_ ), 1 , len (bytes_ ), False , method ),
2648- None ,
2649- )
2642+ # return None if compressed size not match
2643+ bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len - 1 ) + b'\x05 \x00 \x00 \x00 '
2644+ self .assertEqual (
2645+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2646+ io .BytesIO (bytes_ ), 0 , len (bytes_ ), False , method ),
2647+ None ,
2648+ )
26502649
2651- bytes_ = b'123' + comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 '
2652- self .assertEqual (
2653- repacker ._scan_data_descriptor_no_sig_by_decompression (
2654- io .BytesIO (bytes_ ), 3 , len (bytes_ ), False , method ),
2655- (0x4ff4f23f , comp_len , 5 , 12 ),
2656- )
2650+ # zip64
2651+ bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<Q' , comp_len ) + b'\x05 \x00 \x00 \x00 \x00 \x00 \x00 \x00 '
2652+ self .assertEqual (
2653+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2654+ io .BytesIO (bytes_ ), 0 , len (bytes_ ), True , method ),
2655+ (0x4ff4f23f , comp_len , 5 , 20 ),
2656+ )
26572657
2658- # end_offset
2659- bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 '
2660- self .assertEqual (
2661- repacker ._scan_data_descriptor_no_sig_by_decompression (
2662- io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 2 , False , method ),
2663- None ,
2664- )
2658+ # offset
2659+ bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 '
2660+ self .assertEqual (
2661+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2662+ io .BytesIO (bytes_ ), 1 , len (bytes_ ), False , method ),
2663+ None ,
2664+ )
26652665
2666- bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 123 '
2667- self .assertEqual (
2668- repacker ._scan_data_descriptor_no_sig_by_decompression (
2669- io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 2 , False , method ),
2670- (0x4ff4f23f , comp_len , 5 , 12 ),
2671- )
2666+ bytes_ = b'123' + comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 '
2667+ self .assertEqual (
2668+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2669+ io .BytesIO (bytes_ ), 3 , len (bytes_ ), False , method ),
2670+ (0x4ff4f23f , comp_len , 5 , 12 ),
2671+ )
26722672
2673- def test_scan_data_descriptor_no_sig_by_decompression_invalid (self ):
2673+ # end_offset
2674+ bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 '
2675+ self .assertEqual (
2676+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2677+ io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 2 , False , method ),
2678+ None ,
2679+ )
2680+
2681+ bytes_ = comp_bytes + b'\x3f \xf2 \xf4 \x4f ' + struct .pack ('<L' , comp_len ) + b'\x05 \x00 \x00 \x00 123'
2682+ self .assertEqual (
2683+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2684+ io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 2 , False , method ),
2685+ (0x4ff4f23f , comp_len , 5 , 12 ),
2686+ )
2687+
2688+ def _test_scan_data_descriptor_no_sig_by_decompression_invalid (self , method ):
26742689 repacker = zipfile ._ZipRepacker ()
26752690
2676- for method in (
2677- zipfile .ZIP_STORED ,
2678- zipfile .ZIP_LZMA ,
2679- 1024 , # simulate an unknown method
2680- ):
2681- with self .subTest (method = method ):
2682- bytes_ = b'dummy'
2683- self .assertEqual (
2684- repacker ._scan_data_descriptor_no_sig_by_decompression (
2685- io .BytesIO (bytes_ ), 0 , len (bytes_ ), False , method ),
2686- False ,
2687- )
2691+ bytes_ = b'dummy'
2692+ self .assertEqual (
2693+ repacker ._scan_data_descriptor_no_sig_by_decompression (
2694+ io .BytesIO (bytes_ ), 0 , len (bytes_ ), False , method ),
2695+ False ,
2696+ )
26882697
26892698 @requires_zlib ()
2699+ def test_trace_compressed_block_end_zlib (self ):
2700+ import zlib
2701+ self ._test_trace_compressed_block_end (zipfile .ZIP_DEFLATED , zlib .error )
2702+
26902703 @requires_bz2 ()
2704+ def test_trace_compressed_block_end_bz2 (self ):
2705+ self ._test_trace_compressed_block_end (zipfile .ZIP_BZIP2 , OSError )
2706+
26912707 @requires_zstd ()
2692- def test_trace_compressed_block_end (self ):
2693- import zlib
2708+ def test_trace_compressed_block_end_zstd (self ):
26942709 import compression .zstd
2710+ self ._test_trace_compressed_block_end (zipfile .ZIP_ZSTANDARD , compression .zstd .ZstdError )
2711+
2712+ def _test_trace_compressed_block_end (self , method , exc_cls ):
26952713 repacker = zipfile ._ZipRepacker ()
26962714
2697- for method , exc_cls in (
2698- (zipfile .ZIP_DEFLATED , zlib .error ),
2699- (zipfile .ZIP_BZIP2 , OSError ),
2700- (zipfile .ZIP_ZSTANDARD , compression .zstd .ZstdError ),
2701- ):
2702- compressor = zipfile ._get_compressor (method )
2703- with self .subTest (method = method , compressor = compressor ):
2704- comp_bytes = compressor .compress (b'dummy' )
2705- comp_bytes += compressor .flush ()
2706- comp_len = len (comp_bytes )
2707-
2708- # basic
2709- decompressor = zipfile ._get_decompressor (method )
2710- bytes_ = comp_bytes
2711- self .assertEqual (
2712- repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ), decompressor ),
2713- comp_len ,
2714- )
2715+ compressor = zipfile ._get_compressor (method )
27152716
2716- # offset
2717- decompressor = zipfile ._get_decompressor (method )
2718- bytes_ = comp_bytes
2719- with self .assertRaises (exc_cls ):
2720- repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 1 , len (bytes_ ), decompressor )
2717+ comp_bytes = compressor .compress (b'dummy' )
2718+ comp_bytes += compressor .flush ()
2719+ comp_len = len (comp_bytes )
27212720
2722- decompressor = zipfile ._get_decompressor (method )
2723- bytes_ = b'123' + comp_bytes
2724- with self .assertRaises (exc_cls ):
2725- repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ), decompressor )
2721+ # basic
2722+ decompressor = zipfile ._get_decompressor (method )
2723+ bytes_ = comp_bytes
2724+ self .assertEqual (
2725+ repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ), decompressor ),
2726+ comp_len ,
2727+ )
27262728
2727- decompressor = zipfile ._get_decompressor (method )
2728- bytes_ = b'123' + comp_bytes
2729- self .assertEqual (
2730- repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 3 , len (bytes_ ), decompressor ),
2731- comp_len + 3 ,
2732- )
2729+ # offset
2730+ decompressor = zipfile ._get_decompressor (method )
2731+ bytes_ = comp_bytes
2732+ with self .assertRaises (exc_cls ):
2733+ repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 1 , len (bytes_ ), decompressor )
2734+
2735+ decompressor = zipfile ._get_decompressor (method )
2736+ bytes_ = b'123' + comp_bytes
2737+ with self .assertRaises (exc_cls ):
2738+ repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ), decompressor )
2739+
2740+ decompressor = zipfile ._get_decompressor (method )
2741+ bytes_ = b'123' + comp_bytes
2742+ self .assertEqual (
2743+ repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 3 , len (bytes_ ), decompressor ),
2744+ comp_len + 3 ,
2745+ )
27332746
2734- # end_offset
2735- decompressor = zipfile ._get_decompressor (method )
2736- bytes_ = comp_bytes
2737- with self .assertRaises (EOFError ):
2738- repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 1 , decompressor )
2747+ # end_offset
2748+ decompressor = zipfile ._get_decompressor (method )
2749+ bytes_ = comp_bytes
2750+ with self .assertRaises (EOFError ):
2751+ repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 1 , decompressor )
27392752
2740- decompressor = zipfile ._get_decompressor (method )
2741- bytes_ = comp_bytes + b'123'
2742- self .assertEqual (
2743- repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 3 , decompressor ),
2744- comp_len ,
2745- )
2753+ decompressor = zipfile ._get_decompressor (method )
2754+ bytes_ = comp_bytes + b'123'
2755+ self .assertEqual (
2756+ repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ) - 3 , decompressor ),
2757+ comp_len ,
2758+ )
27462759
2747- # chunk_size
2748- decompressor = zipfile ._get_decompressor (method )
2749- bytes_ = comp_bytes
2750- self .assertEqual (
2751- repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ), decompressor , 16 ),
2752- comp_len ,
2753- )
2760+ # chunk_size
2761+ decompressor = zipfile ._get_decompressor (method )
2762+ bytes_ = comp_bytes
2763+ self .assertEqual (
2764+ repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ), decompressor , 16 ),
2765+ comp_len ,
2766+ )
27542767
2755- decompressor = zipfile ._get_decompressor (method )
2756- bytes_ = comp_bytes
2757- self .assertEqual (
2758- repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ), decompressor , 1 ),
2759- comp_len ,
2760- )
2768+ decompressor = zipfile ._get_decompressor (method )
2769+ bytes_ = comp_bytes
2770+ self .assertEqual (
2771+ repacker ._trace_compressed_block_end (io .BytesIO (bytes_ ), 0 , len (bytes_ ), decompressor , 1 ),
2772+ comp_len ,
2773+ )
27612774
27622775 def test_copy_bytes (self ):
27632776 repacker = zipfile ._ZipRepacker ()
0 commit comments