aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com>2024-03-07 04:31:35 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-03-07 04:31:35 +0000
commit175765a24132d13c7070ad470db69563d7488ac7 (patch)
tree865a8b41c40c386cba1b0b97916e5e253f74da88
parent66e8687765e23f7fa536649edb783f2da57d41d9 (diff)
parent6cde1df80a1846f37290d6ce564e8e6a9312ff6c (diff)
downloadflac-175765a24132d13c7070ad470db69563d7488ac7.tar.gz
Merge "Refactored flac_dec_fuzzer" into mainHEADmastermain
-rw-r--r--fuzzer/flac_dec_fuzzer.cpp70
1 files changed, 54 insertions, 16 deletions
diff --git a/fuzzer/flac_dec_fuzzer.cpp b/fuzzer/flac_dec_fuzzer.cpp
index 61413c42..4c188149 100644
--- a/fuzzer/flac_dec_fuzzer.cpp
+++ b/fuzzer/flac_dec_fuzzer.cpp
@@ -18,19 +18,40 @@
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
+#include <fuzzer/FuzzedDataProvider.h>
#include <stdlib.h>
#include <utils/String8.h>
#include "FLAC/stream_decoder.h"
+constexpr FLAC__MetadataType kMetadataTypes[8] = {
+ FLAC__METADATA_TYPE_PICTURE,
+ FLAC__METADATA_TYPE_STREAMINFO,
+ FLAC__METADATA_TYPE_PADDING,
+ FLAC__METADATA_TYPE_APPLICATION,
+ FLAC__METADATA_TYPE_SEEKTABLE,
+ FLAC__METADATA_TYPE_VORBIS_COMMENT,
+ FLAC__METADATA_TYPE_CUESHEET,
+ FLAC__METADATA_TYPE_UNDEFINED,
+};
+
+const char *kMetadataIDs[3] = {
+ "aiff",
+ "riff",
+ "w64",
+};
+
// First four bytes are always "fLaC" in ASCII format.
#define FIRST_ENCODED_BYTE_OFFSET 4
class Codec {
public:
- Codec() = default;
+ Codec(const uint8_t* data, size_t size) : mFdp(data, size) {
+ mBuffer = data;
+ mBufferLen = size;
+ };
~Codec() { deInitDecoder(); }
bool initDecoder();
- void decodeFrames(const uint8_t *data, size_t size);
+ void decodeFrames();
void deInitDecoder();
private:
@@ -43,6 +64,7 @@ class Codec {
const FLAC__int32 *const buffer[]);
void errorCallback(FLAC__StreamDecoderErrorStatus status);
void metadataCallback(const FLAC__StreamMetadata *metadata);
+ FuzzedDataProvider mFdp;
};
bool Codec::initDecoder() {
@@ -70,7 +92,25 @@ bool Codec::initDecoder() {
Codec *client = reinterpret_cast<Codec *>(client_data);
client->errorCallback(status);
};
- FLAC__stream_decoder_set_metadata_respond(mDecoder, FLAC__METADATA_TYPE_STREAMINFO);
+
+ if (mFdp.ConsumeBool()) {
+ FLAC__stream_decoder_set_metadata_ignore(mDecoder, mFdp.PickValueInArray(kMetadataTypes));
+ }
+ if (mFdp.ConsumeBool()) {
+ FLAC__stream_decoder_skip_single_frame(mDecoder);
+ }
+
+ if (mFdp.ConsumeBool()) {
+ FLAC__MetadataType metadataType = mFdp.PickValueInArray(kMetadataTypes);
+ FLAC__stream_decoder_set_metadata_respond(mDecoder, metadataType);
+ }
+ else {
+ FLAC__byte* metadataIgnoreID = (FLAC__byte*)mFdp.PickValueInArray(kMetadataIDs);
+ FLAC__byte* metadataRespondID = (FLAC__byte*)mFdp.PickValueInArray(kMetadataIDs);
+ FLAC__stream_decoder_set_metadata_ignore_application(mDecoder, metadataIgnoreID);
+ FLAC__stream_decoder_set_metadata_respond_application(mDecoder, metadataRespondID);
+ }
+
static auto metadata_callback = [](const FLAC__StreamDecoder *,
const FLAC__StreamMetadata *metadata, void *client_data) {
Codec *client = reinterpret_cast<Codec *>(client_data);
@@ -83,6 +123,12 @@ bool Codec::initDecoder() {
if (initStatus != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
return false;
}
+ if (mFdp.ConsumeBool()) {
+ FLAC__stream_decoder_set_metadata_respond_all(mDecoder);
+ }
+ if (mFdp.ConsumeBool()) {
+ FLAC__stream_decoder_seek_absolute(mDecoder, (FLAC__uint64)mFdp.ConsumeIntegral<uint64_t>());
+ }
return true;
}
@@ -119,16 +165,12 @@ void Codec::metadataCallback(const FLAC__StreamMetadata *metadata) {
return;
}
-void Codec::decodeFrames(const uint8_t *data, size_t size) {
- mBuffer = data;
- mBufferLen = size;
- size_t ofst = std::min((size_t)FIRST_ENCODED_BYTE_OFFSET, size - 1);
- bool decodeEntireStream = data[ofst] & 0x01;
- if (!decodeEntireStream) {
+void Codec::decodeFrames() {
+ if (mFdp.ConsumeBool()) {
if (!FLAC__stream_decoder_process_until_end_of_metadata(mDecoder)) {
return;
}
- while (mBufferPos <= size) {
+ while(mBufferPos <= mBufferLen) {
FLAC__stream_decoder_process_single(mDecoder);
if (FLAC__STREAM_DECODER_END_OF_STREAM == FLAC__stream_decoder_get_state(mDecoder)) {
return;
@@ -150,13 +192,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
if (size == 0) {
return 0;
}
- Codec *codec = new Codec();
- if (!codec) {
- return 0;
- }
+ auto codec = std::make_unique<Codec>(data, size);
if (codec->initDecoder()) {
- codec->decodeFrames(data, size);
+ codec->decodeFrames();
}
- delete codec;
return 0;
}