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ńskiextern "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