| Index: testing/libfuzzer/pdf_jpx_fuzzer.cc
|
| diff --git a/testing/libfuzzer/pdf_jpx_fuzzer.cc b/testing/libfuzzer/pdf_jpx_fuzzer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8e16f24abc402b7e57056507b1d6dedae014395a
|
| --- /dev/null
|
| +++ b/testing/libfuzzer/pdf_jpx_fuzzer.cc
|
| @@ -0,0 +1,52 @@
|
| +// Copyright 2016 The PDFium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <cstdint>
|
| +#include <memory>
|
| +#include <vector>
|
| +
|
| +#include "core/fxcodec/codec/codec_int.h"
|
| +#include "core/include/fxge/fx_dib.h"
|
| +
|
| +CCodec_JpxModule g_module;
|
| +
|
| +struct DecoderDeleter {
|
| + void operator()(CJPX_Decoder* decoder) { g_module.DestroyDecoder(decoder); }
|
| +};
|
| +
|
| +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
|
| + std::unique_ptr<CJPX_Decoder, DecoderDeleter> decoder(
|
| + g_module.CreateDecoder(data, size, nullptr));
|
| + if (!decoder)
|
| + return 0;
|
| +
|
| + FX_DWORD width;
|
| + FX_DWORD height;
|
| + FX_DWORD components;
|
| + g_module.GetImageInfo(decoder.get(), &width, &height, &components);
|
| +
|
| + FXDIB_Format format;
|
| + if (components == 1) {
|
| + format = FXDIB_8bppRgb;
|
| + } else if (components <= 3) {
|
| + format = FXDIB_Rgb;
|
| + } else if (components == 4) {
|
| + format = FXDIB_Rgb32;
|
| + } else {
|
| + width = (width * components + 2) / 3;
|
| + format = FXDIB_Rgb;
|
| + }
|
| +
|
| + std::unique_ptr<CFX_DIBitmap> bitmap(new CFX_DIBitmap);
|
| + if (!bitmap->Create(width, height, format))
|
| + return 0;
|
| +
|
| + std::vector<uint8_t> output_offsets(components);
|
| + for (FX_DWORD i = 0; i < components; ++i)
|
| + output_offsets[i] = i;
|
| +
|
| + g_module.Decode(decoder.get(), bitmap->GetBuffer(), bitmap->GetPitch(),
|
| + output_offsets);
|
| + return 0;
|
| +}
|
|
|