blob: e3a64e039056ed33024440d495645141662ed187 [file] [log] [blame]
// Copyright 2020 The Fuchsia 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 <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <zircon/assert.h>
#include <fbl/array.h>
#include <fuzzer/FuzzedDataProvider.h>
#include <src/lib/chunked-compression/chunked-compressor.h>
#include <src/lib/chunked-compression/compression-params.h>
namespace {
using chunked_compression::ChunkedCompressor;
using chunked_compression::CompressionParams;
using chunked_compression::kStatusOk;
using chunked_compression::Status;
} // namespace
// Fuzz test which compresses |data|, adjusting the parameters for compression based on the
// mutated input.
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
FuzzedDataProvider fuzzed_data(data, size);
int level = fuzzed_data.ConsumeIntegralInRange<int>(CompressionParams::MinCompressionLevel(),
CompressionParams::MaxCompressionLevel());
auto remaining_data = fuzzed_data.ConsumeRemainingBytes<char>();
CompressionParams params;
params.compression_level = level;
ChunkedCompressor compressor(params);
size_t output_limit = compressor.ComputeOutputSizeLimit(remaining_data.size());
fbl::Array<uint8_t> out_buf(new uint8_t[output_limit], output_limit);
size_t compressed_size;
Status status = compressor.Compress(remaining_data.data(), remaining_data.size(), out_buf.data(),
out_buf.size(), &compressed_size);
if (status != kStatusOk) {
fprintf(stderr, "Failed to compress: %d\n", status);
}
return 0;
}