blob: 29a3b1f9f80074b6f016aa8aa4b4b4f106981c74 [file] [log] [blame]
// Copyright 2020 The Chromium OS 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 <net/if.h>
#include <base/bind_helpers.h>
#include <base/logging.h>
#include <dbus/message.h>
#include <fuzzer/FuzzedDataProvider.h>
#include "patchpanel/dbus/client.h"
namespace patchpanel {
class Environment {
public:
Environment() {
logging::SetMinLogLevel(logging::LOGGING_FATAL); // <- DISABLE LOGGING.
}
};
class FakeObjectProxy : public dbus::ObjectProxy {
public:
explicit FakeObjectProxy(dbus::Bus* bus)
: dbus::ObjectProxy(bus, "svc", dbus::ObjectPath("/obj/path"), 0) {}
std::unique_ptr<dbus::Response> CallMethodAndBlockWithErrorDetails(
dbus::MethodCall* method_call,
int timeout_ms,
dbus::ScopedDBusError* error) override {
return nullptr;
}
std::unique_ptr<dbus::Response> CallMethodAndBlock(
dbus::MethodCall* method_call, int timeout_ms) override {
return nullptr;
}
void CallMethod(dbus::MethodCall* method_call,
int timeout_ms,
ResponseCallback callback) override {}
void CallMethodWithErrorResponse(dbus::MethodCall* method_call,
int timeout_ms,
ResponseOrErrorCallback callback) override {}
void CallMethodWithErrorCallback(dbus::MethodCall* method_call,
int timeout_ms,
ResponseCallback callback,
ErrorCallback error_callback) override {}
void ConnectToSignal(const std::string& interface_name,
const std::string& signal_name,
SignalCallback signal_callback,
OnConnectedCallback on_connected_callback) override {}
void WaitForServiceToBeAvailable(
WaitForServiceToBeAvailableCallback callback) override {}
void Detach() override {}
};
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
static Environment env;
dbus::Bus::Options options;
scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
scoped_refptr<dbus::ObjectProxy> proxy(new FakeObjectProxy(bus.get()));
auto client = Client::New(bus, proxy.get());
FuzzedDataProvider provider(data, size);
while (provider.remaining_bytes() > 0) {
client->NotifyArcStartup(provider.ConsumeIntegral<pid_t>());
client->NotifyArcVmStartup(provider.ConsumeIntegral<uint32_t>());
client->NotifyArcVmShutdown(provider.ConsumeIntegral<uint32_t>());
NetworkDevice device;
device.set_ifname(provider.ConsumeRandomLengthString(IFNAMSIZ * 2));
device.set_ipv4_addr(provider.ConsumeIntegral<uint32_t>());
device.mutable_ipv4_subnet()->set_base_addr(
provider.ConsumeIntegral<uint32_t>());
device.mutable_ipv4_subnet()->set_prefix_len(
provider.ConsumeIntegral<uint32_t>());
IPv4Subnet subnet;
subnet.set_base_addr(provider.ConsumeIntegral<uint32_t>());
subnet.set_prefix_len(provider.ConsumeIntegral<uint32_t>());
client->NotifyTerminaVmStartup(provider.ConsumeIntegral<uint32_t>(),
&device, &subnet);
client->NotifyTerminaVmShutdown(provider.ConsumeIntegral<uint32_t>());
client->NotifyPluginVmStartup(provider.ConsumeIntegral<uint64_t>(),
provider.ConsumeIntegral<int>(), &device);
client->NotifyPluginVmShutdown(provider.ConsumeIntegral<uint64_t>());
// TODO(garrick): Enable the following once the memory leaks in Chrome OS
// DBus are resolved.
// client->DefaultVpnRouting(provider.ConsumeIntegral<int>());
// client->RouteOnVpn(provider.ConsumeIntegral<int>());
// client->BypassVpn(provider.ConsumeIntegral<int>());
client->ConnectNamespace(provider.ConsumeIntegral<pid_t>(),
provider.ConsumeRandomLengthString(100),
provider.ConsumeBool(), provider.ConsumeBool(),
TrafficCounter::SYSTEM);
std::set<std::string> devices_for_counters;
for (int i = 0; i < 10; i++) {
if (provider.ConsumeBool()) {
devices_for_counters.insert(
provider.ConsumeRandomLengthString(IFNAMSIZ * 2));
}
}
client->GetTrafficCounters(devices_for_counters, base::DoNothing());
}
bus->ShutdownAndBlock();
return 0;
}
} // namespace patchpanel