summaryrefslogtreecommitdiff
path: root/oss-fuzz
diff options
context:
space:
mode:
authorMartijn van Beurden <mvanb1@gmail.com>2022-06-10 16:16:23 +0200
committerMartijn van Beurden <mvanb1@gmail.com>2022-06-10 21:58:24 +0200
commit3528fa292a3068071d824aabb2e5124dc1dd742a (patch)
tree560bfdfa24c26f29a4dca456ae1d7765db93daf0 /oss-fuzz
parentc2daa371041305ffa85bef7d32b97c93890c696e (diff)
downloadflac-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.cc27
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 {