avifinfo_fuzz: add coverage for non-stream fns AvifInfoIdentify() & AvifInfoGetFeatures() Change-Id: I763b377aae946c5228b25126c442a5b354a98a70
diff --git a/tests/avifinfo_fuzz.cc b/tests/avifinfo_fuzz.cc index 1be3421..993d997 100644 --- a/tests/avifinfo_fuzz.cc +++ b/tests/avifinfo_fuzz.cc
@@ -46,6 +46,16 @@ //------------------------------------------------------------------------------ +static bool Equals(const AvifInfoFeatures& lhs, const AvifInfoFeatures& rhs) { + return lhs.width == rhs.width && lhs.height == rhs.height && + lhs.bit_depth == rhs.bit_depth && + lhs.num_channels == rhs.num_channels && + lhs.has_gainmap == rhs.has_gainmap && + lhs.gainmap_item_id == rhs.gainmap_item_id && + lhs.primary_item_id_location == rhs.primary_item_id_location && + lhs.primary_item_id_bytes == rhs.primary_item_id_bytes; +} + // Test a random bitstream of random size, whether it is valid or not. extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t data_size) { AvifInfoStatus previous_status_identity = kAvifInfoNotEnoughData; @@ -60,11 +70,32 @@ if (size > 4096) size = std::min(data_size, size + 511); StreamData stream = {data, size}; + StreamData stream_features = {data, size}; AvifInfoFeatures features; - const AvifInfoStatus status_identity = + AvifInfoFeatures features_stream; + const AvifInfoStatus status_identity = AvifInfoIdentify(data, size); + const AvifInfoStatus status_identity_stream = AvifInfoIdentifyStream(&stream, StreamRead, StreamSkip); const AvifInfoStatus status_features = - AvifInfoGetFeaturesStream(&stream, StreamRead, StreamSkip, &features); + AvifInfoGetFeatures(data, size, &features); + const AvifInfoStatus status_features_stream = AvifInfoGetFeaturesStream( + &stream_features, StreamRead, StreamSkip, &features_stream); + + if (status_identity_stream != status_identity || + status_features_stream != status_features || + !Equals(features_stream, features)) { + std::abort(); + } + + const uint64_t primary_item_id_location_offset = size - stream.data_size; + const AvifInfoStatus status_features_stream2 = AvifInfoGetFeaturesStream( + &stream, StreamRead, StreamSkip, &features_stream); + features_stream.primary_item_id_location += primary_item_id_location_offset; + if (status_features_stream2 != status_features || + (status_features_stream2 == kAvifInfoOk && + !Equals(features_stream, features))) { + std::abort(); + } if ((previous_status_identity != kAvifInfoNotEnoughData && status_identity != previous_status_identity) || @@ -74,16 +105,7 @@ } if (status_features == previous_status_features) { - if (features.width != previous_features.width || - features.height != previous_features.height || - features.bit_depth != previous_features.bit_depth || - features.num_channels != previous_features.num_channels || - features.has_gainmap != previous_features.has_gainmap || - features.gainmap_item_id != previous_features.gainmap_item_id || - features.primary_item_id_location != - previous_features.primary_item_id_location || - features.primary_item_id_bytes != - previous_features.primary_item_id_bytes) { + if (!Equals(features, previous_features)) { std::abort(); } } else if (status_features == kAvifInfoOk) {