diff options
Diffstat (limited to 'tests/fuzzer/animencoder_fuzzer.cc')
-rw-r--r-- | tests/fuzzer/animencoder_fuzzer.cc | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/tests/fuzzer/animencoder_fuzzer.cc b/tests/fuzzer/animencoder_fuzzer.cc index 1bd7871c..ef6ec1e4 100644 --- a/tests/fuzzer/animencoder_fuzzer.cc +++ b/tests/fuzzer/animencoder_fuzzer.cc @@ -47,6 +47,7 @@ int AddFrame(WebPAnimEncoder** const enc, // Read the source picture. if (!ExtractSourcePicture(&pic, data, size, bit_pos)) { const WebPEncodingError error_code = pic.error_code; + WebPAnimEncoderDelete(*enc); WebPPictureFree(&pic); if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0; fprintf(stderr, "Can't read input image. Error code: %d\n", error_code); @@ -108,7 +109,14 @@ int AddFrame(WebPAnimEncoder** const enc, const WebPEncodingError error_code = pic.error_code; WebPAnimEncoderDelete(*enc); WebPPictureFree(&pic); - if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0; + // Tolerate failures when running under the nallocfuzz engine as + // WebPAnimEncoderAdd() may fail due to memory allocation errors outside of + // the encoder; in muxer functions that return booleans for instance. + if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY || + error_code == VP8_ENC_ERROR_BAD_WRITE || + getenv("NALLOC_FUZZ_VERSION") != nullptr) { + return 0; + } fprintf(stderr, "WebPEncode failed. Error code: %d\n", error_code); abort(); } @@ -163,7 +171,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) { } WebPData webp_data; WebPDataInit(&webp_data); - if (!WebPAnimEncoderAssemble(enc, &webp_data)) { + // Tolerate failures when running under the nallocfuzz engine as allocations + // during assembly may fail. + if (!WebPAnimEncoderAssemble(enc, &webp_data) && + getenv("NALLOC_FUZZ_VERSION") == nullptr) { fprintf(stderr, "WebPAnimEncoderAssemble failed: %s.\n", WebPAnimEncoderGetError(enc)); WebPAnimEncoderDelete(enc); |