| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/sys/fuzzing/framework/engine/coverage-data.h" |
| |
| #include <lib/syslog/cpp/macros.h> |
| #include <zircon/status.h> |
| |
| #include <third_party/modp_b64/modp_b64.h> |
| |
| namespace fuzzing { |
| namespace { |
| |
| // Number of characters needed to encode a target ID. The padding character and null terminator are |
| // not counted. |
| constexpr auto kTargetIdLen = modp_b64_encode_len(sizeof(uint64_t)) - 2; |
| |
| std::string GetName(const zx::vmo& vmo) { |
| char name[ZX_MAX_NAME_LEN]; |
| if (auto status = vmo.get_property(ZX_PROP_NAME, name, sizeof(name)); status != ZX_OK) { |
| FX_LOGS(WARNING) << "Failed to get VMO name: " << zx_status_get_string(status); |
| return std::string(); |
| } |
| return std::string(name); |
| } |
| |
| } // namespace |
| |
| uint64_t GetTargetId(const zx::process& process) { |
| zx_info_handle_basic_t info; |
| if (auto status = process.get_info(ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr); |
| status != ZX_OK) { |
| FX_LOGS(WARNING) << " Failed to get target id for process: " << zx_status_get_string(status); |
| return kInvalidTargetId; |
| } |
| return info.koid; |
| } |
| |
| uint64_t GetTargetId(const zx::vmo& inline_8bit_counters) { |
| return GetTargetId(GetName(inline_8bit_counters)); |
| } |
| |
| uint64_t GetTargetId(const std::string& name) { |
| if (name.size() < kTargetIdLen) { |
| FX_LOGS(WARNING) << "Failed to decode target id: " << name; |
| return kInvalidTargetId; |
| } |
| // See target/module.cc. The last character should be the omitted padding. |
| auto encoded = name.substr(0, kTargetIdLen) + "="; |
| uint64_t target_id; |
| auto len = modp_b64_decode(reinterpret_cast<char*>(&target_id), encoded.data(), encoded.size()); |
| if (len == size_t(-1)) { |
| FX_LOGS(WARNING) << "Failed to decode target id: " << name; |
| return kInvalidTargetId; |
| } |
| return target_id; |
| } |
| |
| std::string GetModuleId(const zx::vmo& inline_8bit_counters) { |
| return GetModuleId(GetName(inline_8bit_counters)); |
| } |
| |
| std::string GetModuleId(const std::string& name) { |
| if (name.size() < kTargetIdLen) { |
| FX_LOGS(WARNING) << "Failed to get module ID from '" << name << "'"; |
| return std::string(); |
| } |
| return name.substr(kTargetIdLen); |
| } |
| |
| } // namespace fuzzing |