xref: /aosp_15_r20/external/zucchini/fuzzers/disassembler_dex_fuzzer.cc (revision a03ca8b91e029cd15055c20c78c2e087c84792e4)
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 "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_dex.h"
12*a03ca8b9SKrzysztof Kosiński 
13*a03ca8b9SKrzysztof Kosiński namespace {
14*a03ca8b9SKrzysztof Kosiński 
15*a03ca8b9SKrzysztof Kosiński struct Environment {
Environment__anon3e5c4e320111::Environment16*a03ca8b9SKrzysztof Kosiński   Environment() { logging::SetMinLogLevel(logging::LOG_FATAL); }
17*a03ca8b9SKrzysztof Kosiński };
18*a03ca8b9SKrzysztof Kosiński 
19*a03ca8b9SKrzysztof Kosiński }  // namespace
20*a03ca8b9SKrzysztof Kosiński 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)21*a03ca8b9SKrzysztof Kosiński extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
22*a03ca8b9SKrzysztof Kosiński   static Environment env;
23*a03ca8b9SKrzysztof Kosiński   if (!size)
24*a03ca8b9SKrzysztof Kosiński     return 0;
25*a03ca8b9SKrzysztof Kosiński   // Prepare data.
26*a03ca8b9SKrzysztof Kosiński   std::vector<uint8_t> mutable_data(data, data + size);
27*a03ca8b9SKrzysztof Kosiński   zucchini::ConstBufferView image(mutable_data.data(), mutable_data.size());
28*a03ca8b9SKrzysztof Kosiński 
29*a03ca8b9SKrzysztof Kosiński   // Create disassembler. Early exit on failure.
30*a03ca8b9SKrzysztof Kosiński   auto disassembler_dex =
31*a03ca8b9SKrzysztof Kosiński       zucchini::Disassembler::Make<zucchini::DisassemblerDex>(image);
32*a03ca8b9SKrzysztof Kosiński   if (!disassembler_dex)
33*a03ca8b9SKrzysztof Kosiński     return 0;
34*a03ca8b9SKrzysztof Kosiński   CHECK_LE(disassembler_dex->size(), image.size());
35*a03ca8b9SKrzysztof Kosiński   zucchini::MutableBufferView mutable_image(mutable_data.data(),
36*a03ca8b9SKrzysztof Kosiński                                             disassembler_dex->size());
37*a03ca8b9SKrzysztof Kosiński 
38*a03ca8b9SKrzysztof Kosiński   std::vector<zucchini::Reference> references;
39*a03ca8b9SKrzysztof Kosiński   // Read all references in the file.
40*a03ca8b9SKrzysztof Kosiński   auto groups = disassembler_dex->MakeReferenceGroups();
41*a03ca8b9SKrzysztof Kosiński   for (const auto& group : groups) {
42*a03ca8b9SKrzysztof Kosiński     auto reader = group.GetReader(disassembler_dex.get());
43*a03ca8b9SKrzysztof Kosiński     for (auto ref = reader->GetNext(); ref.has_value();
44*a03ca8b9SKrzysztof Kosiński          ref = reader->GetNext()) {
45*a03ca8b9SKrzysztof Kosiński       references.push_back(ref.value());
46*a03ca8b9SKrzysztof Kosiński     }
47*a03ca8b9SKrzysztof Kosiński     reader.reset();
48*a03ca8b9SKrzysztof Kosiński     auto writer = group.GetWriter(mutable_image, disassembler_dex.get());
49*a03ca8b9SKrzysztof Kosiński     for (const auto& ref : references)
50*a03ca8b9SKrzysztof Kosiński       writer->PutNext(ref);
51*a03ca8b9SKrzysztof Kosiński     references.clear();
52*a03ca8b9SKrzysztof Kosiński   }
53*a03ca8b9SKrzysztof Kosiński   return 0;
54*a03ca8b9SKrzysztof Kosiński }
55