From 3528fa292a3068071d824aabb2e5124dc1dd742a Mon Sep 17 00:00:00 2001 From: Martijn van Beurden Date: Fri, 10 Jun 2022 16:16:23 +0200 Subject: Check found metadata in decoder fuzzer This greatly improves code coverage --- oss-fuzz/fuzzer_decoder.cc | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'oss-fuzz') 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 #include "FLAC++/decoder.h" +#include "FLAC++/metadata.h" template <> FLAC__MetadataType fuzzing::datasource::Base::Get(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(cloned_object)->is_legal(); + if (cloned_object->get_type() == FLAC__METADATA_TYPE_PICTURE) + dynamic_cast(cloned_object)->is_legal(NULL); + if (cloned_object->get_type() == FLAC__METADATA_TYPE_CUESHEET) + dynamic_cast(cloned_object)->is_legal(true,NULL); + } + delete cloned_object; } ::FLAC__StreamDecoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset) override { -- cgit v1.2.1