1// Copyright 2018 The Chromium OS Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <vector> 6 7#include "base/logging.h" 8#include "brillo/test_helpers.h" 9 10#include "puffin/src/bit_reader.h" 11#include "puffin/src/bit_writer.h" 12#include "puffin/src/include/puffin/common.h" 13#include "puffin/src/include/puffin/huffer.h" 14#include "puffin/src/include/puffin/puffer.h" 15#include "puffin/src/include/puffin/puffpatch.h" 16#include "puffin/src/memory_stream.h" 17#include "puffin/src/puff_reader.h" 18#include "puffin/src/puff_writer.h" 19 20using std::vector; 21 22using puffin::BitExtent; 23using puffin::Buffer; 24using puffin::BufferBitReader; 25using puffin::BufferBitWriter; 26using puffin::BufferPuffReader; 27using puffin::BufferPuffWriter; 28using puffin::Error; 29using puffin::Huffer; 30using puffin::MemoryStream; 31using puffin::Puffer; 32 33namespace { 34void FuzzPuff(const uint8_t* data, size_t size) { 35 BufferBitReader bit_reader(data, size); 36 Buffer puff_buffer(size * 2); 37 BufferPuffWriter puff_writer(puff_buffer.data(), puff_buffer.size()); 38 vector<BitExtent> bit_extents; 39 Error error; 40 Puffer puffer; 41 puffer.PuffDeflate(&bit_reader, &puff_writer, &bit_extents, &error); 42} 43 44void FuzzHuff(const uint8_t* data, size_t size) { 45 BufferPuffReader puff_reader(data, size); 46 Buffer deflate_buffer(size); 47 BufferBitWriter bit_writer(deflate_buffer.data(), deflate_buffer.size()); 48 Error error; 49 Huffer huffer; 50 huffer.HuffDeflate(&puff_reader, &bit_writer, &error); 51} 52 53void FuzzPuffPatch(const uint8_t* data, size_t size) { 54 const size_t kBufferSize = 1000; 55 Buffer src_buffer(kBufferSize); 56 Buffer dst_buffer(kBufferSize); 57 auto src = MemoryStream::CreateForRead(src_buffer); 58 auto dst = MemoryStream::CreateForWrite(&dst_buffer); 59 puffin::PuffPatch(std::move(src), std::move(dst), data, size, kBufferSize); 60} 61 62struct Environment { 63 Environment() { 64 // To turn off the logging. 65 logging::SetMinLogLevel(logging::LOG_FATAL); 66 67 // To turn off logging for bsdiff library. 68 std::cerr.setstate(std::ios_base::failbit); 69 } 70}; 71Environment* env = new Environment(); 72 73} // namespace 74 75extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { 76 FuzzPuff(data, size); 77 FuzzHuff(data, size); 78 FuzzPuffPatch(data, size); 79 return 0; 80} 81