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