Skip to content

Commit 32eadf7

Browse files
committed
Enable alloc_check for metadata fuzzer
1 parent 16e52e5 commit 32eadf7

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

oss-fuzz/metadata.cc

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@
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+
4349
static void run_tests_with_level_0_interface(char filename[]);
4450
static void run_tests_with_level_1_interface(char filename[], bool readonly, bool preservestats, const uint8_t *data, size_t size);
4551
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)
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:

src/libFLAC++/metadata.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ namespace FLAC {
152152
object_(copy? ::FLAC__metadata_object_clone(object) : object),
153153
is_reference_(false)
154154
{
155+
#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
155156
FLAC__ASSERT(0 != object);
157+
#endif
156158
}
157159

158160
Prototype::~Prototype()

0 commit comments

Comments
 (0)