// Copyright 2018 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 "crosdns/hosts_modifier.h"

#include <fuzzer/FuzzedDataProvider.h>
#include <string>

#include <base/files/scoped_temp_dir.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/strings/string_number_conversions.h>

constexpr char kBaseFileContents[] =
    "# Example /etc/hosts file\n"
    "127.0.0.1 localhost\n";
constexpr char kValidIpPrefix[] = "100.115.92.";
constexpr char kValidHostnameSuffix[] = ".linux.test";

struct Environment {
  Environment() {
    CHECK(temp_dir.CreateUniqueTempDir());
    base::FilePath hosts_file = temp_dir.GetPath().Append("hosts");
    base::WriteFile(hosts_file, kBaseFileContents, strlen(kBaseFileContents));
    hosts_modifier.Init(hosts_file);
  }

  base::ScopedTempDir temp_dir;
  crosdns::HostsModifier hosts_modifier;
};

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  static Environment env;
  FuzzedDataProvider data_provider(data, size);
  // The aspects that we randomize based on the fuzzed data for better coverage
  // are:
  // - Using a valid numerical IP address (i.e. x.x.x.x where x < 256)
  // - Using an IP address in our allowed range of 100.115.92.x
  // - Using a valid hostname suffix of .linux.test
  // - Using the same hostname for remove as add vs. a fuzzed hostname
  std::string ip;
  bool useNumericIp = data_provider.ConsumeBool();
  if (useNumericIp) {
    bool useValidIpRange = data_provider.ConsumeBool();
    if (useValidIpRange) {
      ip = kValidIpPrefix;
      ip.append(base::IntToString(data_provider.ConsumeIntegral<uint8_t>()));
    } else {
      ip = base::IntToString(data_provider.ConsumeIntegral<uint8_t>()) + "." +
           base::IntToString(data_provider.ConsumeIntegral<uint8_t>()) + "." +
           base::IntToString(data_provider.ConsumeIntegral<uint8_t>()) + "." +
           base::IntToString(data_provider.ConsumeIntegral<uint8_t>());
    }
  } else {
    // We will want up to 3 strings, so take a random length of 1/3 the total
    // length.
    ip = data_provider.ConsumeRandomLengthString(size / 3);
  }
  std::string hostname;
  bool useValidHostnameSuffix = data_provider.ConsumeBool();
  if (useValidHostnameSuffix) {
    hostname = data_provider.ConsumeRandomLengthString(size / 3) +
               kValidHostnameSuffix;
  } else {
    hostname = data_provider.ConsumeRandomLengthString(size / 3);
  }
  std::string err;
  // Use the empty string for IPv6 since we don't do anything with that arg yet.
  env.hosts_modifier.SetHostnameIpMapping(hostname, ip, "", &err);

  bool removeSameHostnameAdded = data_provider.ConsumeBool();
  if (removeSameHostnameAdded) {
    env.hosts_modifier.RemoveHostnameIpMapping(hostname, &err);
  } else {
    env.hosts_modifier.RemoveHostnameIpMapping(
        data_provider.ConsumeRandomLengthString(size / 3), &err);
  }
  return 0;
}
