4040
4141#define min (x,y ) (x<y?x:y)
4242
43+ #define THROW_AWAY_TRANSFER \
44+ { \
45+ delete metadata_block_transfer; \
46+ metadata_block_transfer = 0 ; \
47+ }
48+
4349static void run_tests_with_level_0_interface (char filename[]);
4450static void run_tests_with_level_1_interface (char filename[], bool readonly, bool preservestats, const uint8_t *data, size_t size);
4551static void run_tests_with_level_2_interface (char filename[], bool ogg, bool use_padding, const uint8_t *data, size_t size);
@@ -61,7 +67,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
6167
6268 command_length = data[0 ] >> 4 ;
6369
64- if (0 ) // data[1] < 128) /* Use MSB as on/off */
70+ if (data[1 ] < 128 ) /* Use MSB as on/off */
6571 alloc_check_threshold = data[1 ];
6672 else
6773 alloc_check_threshold = INT32_MAX;
@@ -83,7 +89,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
8389 }
8490
8591 run_tests_with_level_0_interface (filename);
92+ alloc_check_counter = 0 ;
8693 run_tests_with_level_1_interface (filename, init_bools[1 ], init_bools[2 ], data+CONFIG_LENGTH, command_length/2 );
94+ alloc_check_counter = 0 ;
8795
8896 /* Dump input to file, to start fresh for level 2 */
8997 if (!init_bools[1 ]){
@@ -177,7 +185,7 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
177185 FLAC::Metadata::Prototype *metadata_block_transfer = nullptr ;
178186 FLAC::Metadata::Prototype *metadata_block_put = nullptr ;
179187
180- if (!chain.is_valid ())
188+ if (!chain.is_valid () || !iterator. is_valid () )
181189 return ;
182190
183191 if (!chain.read (filename, ogg))
@@ -207,10 +215,14 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
207215 delete metadata_block_transfer;
208216 metadata_block_transfer = nullptr ;
209217 metadata_block_transfer = FLAC::Metadata::clone (metadata_block_get);
218+ if (!metadata_block_transfer->is_valid ())
219+ THROW_AWAY_TRANSFER
210220 }
211221 }
212222 else {
213223 metadata_block_transfer = FLAC::Metadata::clone (metadata_block_get);
224+ if (!metadata_block_transfer->is_valid ())
225+ THROW_AWAY_TRANSFER
214226 }
215227 }
216228 delete metadata_block_get;
@@ -293,14 +305,16 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
293305 num_tracks = cuesheet->get_num_tracks ();
294306 if (num_tracks > 0 ) {
295307 FLAC::Metadata::CueSheet::Track track = cuesheet->get_track (min (data[i]>>4 ,num_tracks-1 ));
296- track.get_offset ();
297- track.get_number ();
298- track.get_isrc ();
299- track.get_pre_emphasis ();
300- num_indices = track.get_num_indices ();
301- if (num_indices > 0 ) {
302- FLAC__StreamMetadata_CueSheet_Index index = track.get_index (min (data[i]>>4 ,num_indices-1 ));
303- (void )index;
308+ if (track.is_valid ()) {
309+ track.get_offset ();
310+ track.get_number ();
311+ track.get_isrc ();
312+ track.get_pre_emphasis ();
313+ num_indices = track.get_num_indices ();
314+ if (num_indices > 0 ) {
315+ FLAC__StreamMetadata_CueSheet_Index index = track.get_index (min (data[i]>>4 ,num_indices-1 ));
316+ (void )index;
317+ }
304318 }
305319 }
306320 }
@@ -442,9 +456,11 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
442456 num_tracks = cuesheet->get_num_tracks ();
443457 if (num_tracks > 0 ) {
444458 FLAC::Metadata::CueSheet::Track track = cuesheet->get_track (min (data[i]>>4 ,num_tracks-1 ));
445- if (track.get_num_indices () > 0 )
446- cuesheet->delete_index (min (data[i]>>4 ,num_tracks-1 ),0 );
447- cuesheet->delete_track (0 );
459+ if (track.is_valid ()) {
460+ if (track.get_num_indices () > 0 )
461+ cuesheet->delete_index (min (data[i]>>4 ,num_tracks-1 ),0 );
462+ cuesheet->delete_track (0 );
463+ }
448464 }
449465 }
450466 break ;
@@ -478,7 +494,8 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
478494 FLAC::Metadata::VorbisComment * vorbiscomment = dynamic_cast <FLAC::Metadata::VorbisComment *>(metadata_block_transfer);
479495 if (vorbiscomment == 0 )
480496 break ;
481- vorbiscomment->resize_comments (data[i]>>4 );
497+ if (!vorbiscomment->resize_comments (data[i]>>4 ))
498+ THROW_AWAY_TRANSFER
482499 }
483500 break ;
484501 case FLAC__METADATA_TYPE_CUESHEET:
0 commit comments