diff options
author | Martijn van Beurden <mvanb1@gmail.com> | 2022-06-10 16:16:23 +0200 |
---|---|---|
committer | Martijn van Beurden <mvanb1@gmail.com> | 2022-06-10 21:58:24 +0200 |
commit | 3528fa292a3068071d824aabb2e5124dc1dd742a (patch) | |
tree | 560bfdfa24c26f29a4dca456ae1d7765db93daf0 /oss-fuzz | |
parent | c2daa371041305ffa85bef7d32b97c93890c696e (diff) | |
download | flac-3528fa292a3068071d824aabb2e5124dc1dd742a.tar.gz |
Check found metadata in decoder fuzzer
This greatly improves code coverage
Diffstat (limited to 'oss-fuzz')
-rw-r--r-- | oss-fuzz/fuzzer_decoder.cc | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/oss-fuzz/fuzzer_decoder.cc b/oss-fuzz/fuzzer_decoder.cc index da88c3df..4afe11b9 100644 --- a/oss-fuzz/fuzzer_decoder.cc +++ b/oss-fuzz/fuzzer_decoder.cc @@ -28,6 +28,7 @@ #include <fuzzing/memory.hpp> #include "FLAC++/decoder.h" +#include "FLAC++/metadata.h" template <> FLAC__MetadataType fuzzing::datasource::Base::Get<FLAC__MetadataType>(const uint64_t id) { (void)id; @@ -116,10 +117,36 @@ namespace FLAC { } void metadata_callback(const ::FLAC__StreamMetadata *metadata) override { + Metadata::Prototype * cloned_object = nullptr; fuzzing::memory::memory_test(metadata->type); fuzzing::memory::memory_test(metadata->is_last); fuzzing::memory::memory_test(metadata->length); fuzzing::memory::memory_test(metadata->data); + if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) + cloned_object = new Metadata::StreamInfo(metadata); + else if (metadata->type == FLAC__METADATA_TYPE_PADDING) + cloned_object = new Metadata::Padding(metadata); + else if (metadata->type == FLAC__METADATA_TYPE_APPLICATION) + cloned_object = new Metadata::Application(metadata); + else if (metadata->type == FLAC__METADATA_TYPE_SEEKTABLE) + cloned_object = new Metadata::SeekTable(metadata); + else if (metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) + cloned_object = new Metadata::VorbisComment(metadata); + else if (metadata->type == FLAC__METADATA_TYPE_CUESHEET) + cloned_object = new Metadata::CueSheet(metadata); + else if (metadata->type == FLAC__METADATA_TYPE_PICTURE) + cloned_object = new Metadata::Picture(metadata); + else + return; + if (0 != cloned_object && *cloned_object == *metadata && cloned_object->is_valid()) { + if (cloned_object->get_type() == FLAC__METADATA_TYPE_SEEKTABLE) + dynamic_cast<Metadata::SeekTable *>(cloned_object)->is_legal(); + if (cloned_object->get_type() == FLAC__METADATA_TYPE_PICTURE) + dynamic_cast<Metadata::Picture *>(cloned_object)->is_legal(NULL); + if (cloned_object->get_type() == FLAC__METADATA_TYPE_CUESHEET) + dynamic_cast<Metadata::CueSheet *>(cloned_object)->is_legal(true,NULL); + } + delete cloned_object; } ::FLAC__StreamDecoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset) override { |