40
40
41
41
#define min (x,y ) (x<y?x:y)
42
42
43
+ #define THROW_AWAY_TRANSFER \
44
+ { \
45
+ delete metadata_block_transfer; \
46
+ metadata_block_transfer = 0 ; \
47
+ }
48
+
43
49
static void run_tests_with_level_0_interface (char filename[]);
44
50
static void run_tests_with_level_1_interface (char filename[], bool readonly, bool preservestats, const uint8_t *data, size_t size);
45
51
static 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)
61
67
62
68
command_length = data[0 ] >> 4 ;
63
69
64
- if (0 ) // data[1] < 128) /* Use MSB as on/off */
70
+ if (data[1 ] < 128 ) /* Use MSB as on/off */
65
71
alloc_check_threshold = data[1 ];
66
72
else
67
73
alloc_check_threshold = INT32_MAX;
@@ -83,7 +89,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
83
89
}
84
90
85
91
run_tests_with_level_0_interface (filename);
92
+ alloc_check_counter = 0 ;
86
93
run_tests_with_level_1_interface (filename, init_bools[1 ], init_bools[2 ], data+CONFIG_LENGTH, command_length/2 );
94
+ alloc_check_counter = 0 ;
87
95
88
96
/* Dump input to file, to start fresh for level 2 */
89
97
if (!init_bools[1 ]){
@@ -177,7 +185,7 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
177
185
FLAC::Metadata::Prototype *metadata_block_transfer = nullptr ;
178
186
FLAC::Metadata::Prototype *metadata_block_put = nullptr ;
179
187
180
- if (!chain.is_valid ())
188
+ if (!chain.is_valid () || !iterator. is_valid () )
181
189
return ;
182
190
183
191
if (!chain.read (filename, ogg))
@@ -207,10 +215,14 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
207
215
delete metadata_block_transfer;
208
216
metadata_block_transfer = nullptr ;
209
217
metadata_block_transfer = FLAC::Metadata::clone (metadata_block_get);
218
+ if (!metadata_block_transfer->is_valid ())
219
+ THROW_AWAY_TRANSFER
210
220
}
211
221
}
212
222
else {
213
223
metadata_block_transfer = FLAC::Metadata::clone (metadata_block_get);
224
+ if (!metadata_block_transfer->is_valid ())
225
+ THROW_AWAY_TRANSFER
214
226
}
215
227
}
216
228
delete metadata_block_get;
@@ -293,14 +305,16 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
293
305
num_tracks = cuesheet->get_num_tracks ();
294
306
if (num_tracks > 0 ) {
295
307
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
+ }
304
318
}
305
319
}
306
320
}
@@ -442,9 +456,11 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
442
456
num_tracks = cuesheet->get_num_tracks ();
443
457
if (num_tracks > 0 ) {
444
458
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
+ }
448
464
}
449
465
}
450
466
break ;
@@ -478,7 +494,8 @@ static void run_tests_with_level_2_interface(char filename[], bool ogg, bool use
478
494
FLAC::Metadata::VorbisComment * vorbiscomment = dynamic_cast <FLAC::Metadata::VorbisComment *>(metadata_block_transfer);
479
495
if (vorbiscomment == 0 )
480
496
break ;
481
- vorbiscomment->resize_comments (data[i]>>4 );
497
+ if (!vorbiscomment->resize_comments (data[i]>>4 ))
498
+ THROW_AWAY_TRANSFER
482
499
}
483
500
break ;
484
501
case FLAC__METADATA_TYPE_CUESHEET:
0 commit comments