xref: /aosp_15_r20/external/zucchini/fuzzers/disassembler_elf_fuzzer.cc (revision a03ca8b91e029cd15055c20c78c2e087c84792e4)
1*a03ca8b9SKrzysztof Kosiński // Copyright 2019 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 "base/logging.h"
9*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/buffer_view.h"
10*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/disassembler.h"
11*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/disassembler_elf.h"
12*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/fuzzers/fuzz_utils.h"
13*a03ca8b9SKrzysztof Kosiński 
14*a03ca8b9SKrzysztof Kosiński namespace {
15*a03ca8b9SKrzysztof Kosiński 
16*a03ca8b9SKrzysztof Kosiński struct Environment {
Environment__anon83de26c80111::Environment17*a03ca8b9SKrzysztof Kosiński   Environment() { logging::SetMinLogLevel(logging::LOG_FATAL); }
18*a03ca8b9SKrzysztof Kosiński };
19*a03ca8b9SKrzysztof Kosiński 
20*a03ca8b9SKrzysztof Kosiński }  // namespace
21*a03ca8b9SKrzysztof Kosiński 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)22*a03ca8b9SKrzysztof Kosiński extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
23*a03ca8b9SKrzysztof Kosiński   static Environment env;
24*a03ca8b9SKrzysztof Kosiński   if (!size)
25*a03ca8b9SKrzysztof Kosiński     return 0;
26*a03ca8b9SKrzysztof Kosiński   // Prepare data.
27*a03ca8b9SKrzysztof Kosiński   std::vector<uint8_t> mutable_data(data, data + size);
28*a03ca8b9SKrzysztof Kosiński   zucchini::ConstBufferView image(mutable_data.data(), mutable_data.size());
29*a03ca8b9SKrzysztof Kosiński 
30*a03ca8b9SKrzysztof Kosiński   // Create disassembler. Early exit on failure.
31*a03ca8b9SKrzysztof Kosiński   auto disassembler_elf_x64 =
32*a03ca8b9SKrzysztof Kosiński       zucchini::Disassembler::Make<zucchini::DisassemblerElfX64>(image);
33*a03ca8b9SKrzysztof Kosiński   if (disassembler_elf_x64) {
34*a03ca8b9SKrzysztof Kosiński     zucchini::ReadAndWriteReferences(std::move(disassembler_elf_x64),
35*a03ca8b9SKrzysztof Kosiński                                      &mutable_data);
36*a03ca8b9SKrzysztof Kosiński     return 0;
37*a03ca8b9SKrzysztof Kosiński   }
38*a03ca8b9SKrzysztof Kosiński 
39*a03ca8b9SKrzysztof Kosiński   auto disassembler_elf_x86 =
40*a03ca8b9SKrzysztof Kosiński       zucchini::Disassembler::Make<zucchini::DisassemblerElfX86>(image);
41*a03ca8b9SKrzysztof Kosiński   if (disassembler_elf_x86)
42*a03ca8b9SKrzysztof Kosiński     zucchini::ReadAndWriteReferences(std::move(disassembler_elf_x86),
43*a03ca8b9SKrzysztof Kosiński                                      &mutable_data);
44*a03ca8b9SKrzysztof Kosiński   return 0;
45*a03ca8b9SKrzysztof Kosiński }
46