blob: 746dcd566d568c9a5e310cd6e08742b8cc628b23 [file] [log] [blame] [edit]
// 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 <base/at_exit.h>
#include <base/logging.h>
#include <fuzzer/FuzzedDataProvider.h>
#include "dns-proxy/ares_client.h"
#include <base/task/single_thread_task_executor.h>
#include <brillo/message_loops/base_message_loop.h>
namespace dns_proxy {
namespace {
class Environment {
public:
Environment() {
logging::SetMinLogLevel(logging::LOGGING_FATAL); // <- DISABLE LOGGING.
}
base::AtExitManager at_exit;
};
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
static Environment env;
base::SingleThreadTaskExecutor task_executor(base::MessagePumpType::IO);
brillo::BaseMessageLoop loop(task_executor.task_runner());
loop.SetAsCurrent();
FuzzedDataProvider provider(data, size);
AresClient ares_client(base::TimeDelta::FromSeconds(1), 1, 1);
while (provider.remaining_bytes() > 0) {
size_t n = provider.ConsumeIntegralInRange<size_t>(0, 99);
std::vector<std::string> s;
s.reserve(n);
for (size_t i = 0; i < n; ++i) {
s.emplace_back(provider.ConsumeRandomLengthString(
std::numeric_limits<unsigned int>::max()));
}
ares_client.SetNameServers(s);
s.clear();
s.push_back("8.8.8.8");
ares_client.SetNameServers(s);
auto msg = provider.ConsumeBytes<unsigned char>(
std::numeric_limits<unsigned int>::max());
ares_client.Resolve(
msg.data(), msg.size(),
base::BindRepeating([](void*, int, uint8_t*, size_t) {}), nullptr);
base::RunLoop().RunUntilIdle();
}
return 0;
}
} // namespace
} // namespace dns_proxy