1 // Copyright 2018 The Chromium 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 <stddef.h> 6 #include <stdint.h> 7 8 #include <map> 9 #include <memory> 10 #include <vector> 11 12 #include "base/logging.h" 13 #include "components/zucchini/buffer_view.h" 14 #include "components/zucchini/disassembler.h" 15 #include "components/zucchini/disassembler_win32.h" 16 #include "components/zucchini/fuzzers/fuzz_utils.h" 17 18 namespace { 19 20 struct Environment { Environment__anon0ec7e6440111::Environment21 Environment() { 22 logging::SetMinLogLevel(logging::LOG_FATAL); // Disable console spamming. 23 } 24 }; 25 26 } // namespace 27 28 // Entry point for LibFuzzer. LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)29extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { 30 static Environment env; 31 if (!size) 32 return 0; 33 // Prepare data. 34 std::vector<uint8_t> mutable_data(data, data + size); 35 zucchini::ConstBufferView image(mutable_data.data(), mutable_data.size()); 36 37 // One of x86 or x64 should return a non-nullptr if the data is valid. 38 auto disassembler_win32x86 = 39 zucchini::Disassembler::Make<zucchini::DisassemblerWin32X86>(image); 40 if (disassembler_win32x86) { 41 zucchini::ReadAndWriteReferences(std::move(disassembler_win32x86), 42 &mutable_data); 43 return 0; 44 } 45 46 auto disassembler_win32x64 = 47 zucchini::Disassembler::Make<zucchini::DisassemblerWin32X64>(image); 48 if (disassembler_win32x64) 49 zucchini::ReadAndWriteReferences(std::move(disassembler_win32x64), 50 &mutable_data); 51 return 0; 52 } 53