blob: 24c7135bb1fbe224d7aecf3ac16ef79c6ea014f7 [file] [log] [blame]
// Copyright 2021 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 <vector>
#include <base/check.h>
#include <base/logging.h>
#include <fuzzer/FuzzedDataProvider.h>
#include "shill/net/io_handler.h"
#include "shill/net/sockets.h"
#include "shill/vpn/openvpn_driver.h"
#include "shill/vpn/openvpn_management_server.h"
namespace {
const int kPlaceholderSocket = 234;
}
namespace shill {
class FakeOpenVPNDriver : public OpenVPNDriver {
public:
FakeOpenVPNDriver() : OpenVPNDriver(nullptr, nullptr) {}
FakeOpenVPNDriver(const FakeOpenVPNDriver&) = delete;
FakeOpenVPNDriver& operator=(const FakeOpenVPNDriver&) = delete;
~FakeOpenVPNDriver() = default;
void OnReconnecting(ReconnectReason) override{};
void FailService(Service::ConnectFailure, const std::string&) override{};
void ReportCipherMetrics(const std::string&) override{};
};
class FakeSockets : public Sockets {
public:
FakeSockets() = default;
FakeSockets(const FakeSockets&) = delete;
FakeSockets& operator=(const FakeSockets&) = delete;
~FakeSockets() override = default;
int Accept(int sockfd,
struct sockaddr* addr,
socklen_t* addrlen) const override {
return kPlaceholderSocket;
};
int Close(int fd) const override { return 0; };
ssize_t Send(int sockfd,
const void* buf,
size_t len,
int flags) const override {
return len;
};
};
class OpenVPNManagementServerFuzzer {
public:
void Run(const uint8_t* data, size_t size) {
// First just send random strings.
FuzzedDataProvider provider(data, size);
OpenVPNManagementServer::ParseSubstring(
provider.ConsumeRandomLengthString(1024),
provider.ConsumeRandomLengthString(1024),
provider.ConsumeRandomLengthString(1024));
// Next force some of the logic to actually run.
OpenVPNManagementServer::ParseSubstring(
provider.ConsumeRandomLengthString(1024),
provider.ConsumeBytesAsString(1), provider.ConsumeBytesAsString(1));
// Next the helpers.
OpenVPNManagementServer::ParsePasswordTag(
provider.ConsumeRandomLengthString(1024));
OpenVPNManagementServer::ParsePasswordFailedReason(
provider.ConsumeRandomLengthString(1024));
// Send remaining data to test general entry point OnInput().
auto data_vector = provider.ConsumeRemainingBytes<uint8_t>();
InputData input_data(data_vector.data(), data_vector.size());
FakeOpenVPNDriver driver;
FakeSockets sockets;
OpenVPNManagementServer server(&driver);
server.connected_socket_ = kPlaceholderSocket;
server.sockets_ = &sockets;
server.OnInput(&input_data);
}
};
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
// Turn off logging.
logging::SetMinLogLevel(logging::LOGGING_FATAL);
OpenVPNManagementServerFuzzer fuzzer;
fuzzer.Run(data, size);
return 0;
}
} // namespace shill