Skip to content

Commit

Permalink
Add a simple fuzzer that decodes (non incrementally) a bitstream. (AO…
Browse files Browse the repository at this point in the history
…MediaCodec#1630)

Uses the avif files in libavif/tests/data as seeds.
  • Loading branch information
maryla-uc authored Sep 28, 2023
1 parent fc00f1b commit cfbee48
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ if(AVIF_ENABLE_GTEST AND AVIF_ENABLE_FUZZTEST)
)
endif()

add_avif_fuzztest(avif_fuzztest_dec)
add_avif_fuzztest(avif_fuzztest_dec_incr avifincrtest_helpers)
add_avif_fuzztest(avif_fuzztest_enc_dec)
add_avif_fuzztest(avif_fuzztest_read_image)
Expand Down
50 changes: 50 additions & 0 deletions tests/gtest/avif_fuzztest_dec.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright 2023 Google LLC
// SPDX-License-Identifier: BSD-2-Clause
// Decodes an arbitrary sequence of bytes.

#include <cstdint>

#include "avif/avif.h"
#include "avif_fuzztest_helpers.h"
#include "fuzztest/fuzztest.h"
#include "gtest/gtest.h"

using ::fuzztest::Arbitrary;

namespace libavif {
namespace testutil {
namespace {

::testing::Environment* const stack_limit_env =
::testing::AddGlobalTestEnvironment(
new FuzztestStackLimitEnvironment("524288")); // 512 * 1024

//------------------------------------------------------------------------------

void Decode(const std::string& arbitrary_bytes, AvifDecoderPtr decoder) {
testutil::AvifImagePtr decoded(avifImageCreateEmpty(), avifImageDestroy);
ASSERT_NE(decoded, nullptr);
const avifResult result = avifDecoderReadMemory(
decoder.get(), decoded.get(),
reinterpret_cast<const uint8_t*>(arbitrary_bytes.data()),
arbitrary_bytes.size());
if (result == AVIF_RESULT_OK) {
EXPECT_GT(decoded->width, 0u);
EXPECT_GT(decoded->height, 0u);
}
}

constexpr uint32_t kMaxFileSize = 1024 * 1024; // 1MB.

FUZZ_TEST(DecodeAvifTest, Decode)
.WithDomains(Arbitrary<std::string>()
.WithMaxSize(kMaxFileSize)
.WithSeeds(GetTestImagesContents(
kMaxFileSize, {AVIF_APP_FILE_FORMAT_AVIF})),
ArbitraryAvifDecoder({AVIF_CODEC_CHOICE_AUTO}));

//------------------------------------------------------------------------------

} // namespace
} // namespace testutil
} // namespace libavif

0 comments on commit cfbee48

Please sign in to comment.