blob: a28816153ef47f9d6aab016c506319aa360d3a56 [file] [log] [blame]
Hugo Benichib9b93fe2019-10-25 23:36:01 +09001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <net/if.h>
6
7#include <fuzzer/FuzzedDataProvider.h>
8#include <string>
9#include <vector>
10
11#include <base/bind.h>
Garrick Evans495dfc42020-02-14 07:20:57 +090012#include <base/bind_helpers.h>
Hugo Benichib9b93fe2019-10-25 23:36:01 +090013#include <base/logging.h>
14
Garrick Evans3388a032020-03-24 11:25:55 +090015#include "patchpanel/datapath.h"
16#include "patchpanel/minijailed_process_runner.h"
17#include "patchpanel/multicast_forwarder.h"
18#include "patchpanel/net_util.h"
Hugo Benichib9b93fe2019-10-25 23:36:01 +090019
Garrick Evans3388a032020-03-24 11:25:55 +090020namespace patchpanel {
Hugo Benichib9b93fe2019-10-25 23:36:01 +090021
22// Always succeeds
23int ioctl_stub(int fd, unsigned long req, ...) {
24 return 0;
25}
26
27class RandomProcessRunner : public MinijailedProcessRunner {
28 public:
29 explicit RandomProcessRunner(FuzzedDataProvider* data_provider)
30 : data_provider_{data_provider} {}
31 ~RandomProcessRunner() = default;
32
33 int Run(const std::vector<std::string>& argv, bool log_failures) override {
34 return data_provider_->ConsumeBool();
35 }
36
Hugo Benichib9b93fe2019-10-25 23:36:01 +090037 private:
38 FuzzedDataProvider* data_provider_;
39
40 DISALLOW_COPY_AND_ASSIGN(RandomProcessRunner);
41};
42
43namespace {
44
45class Environment {
46 public:
47 Environment() {
48 logging::SetMinLogLevel(logging::LOG_FATAL); // <- DISABLE LOGGING.
49 }
50};
51
52extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
53 // Turn off logging.
54 logging::SetMinLogLevel(logging::LOG_FATAL);
55
56 FuzzedDataProvider provider(data, size);
57 RandomProcessRunner runner(&provider);
58 Datapath datapath(&runner, ioctl_stub);
59
60 while (provider.remaining_bytes() > 0) {
61 std::string ifname = provider.ConsumeRandomLengthString(IFNAMSIZ - 1);
62 std::string bridge = provider.ConsumeRandomLengthString(IFNAMSIZ - 1);
Garrick Evans495dfc42020-02-14 07:20:57 +090063 uint32_t addr = provider.ConsumeIntegral<uint32_t>();
64 std::string addr_str = IPv4AddressToString(addr);
65 uint32_t prefix_len = provider.ConsumeIntegralInRange<uint32_t>(0, 31);
66 Subnet subnet(provider.ConsumeIntegral<int32_t>(), prefix_len,
hschamee9e3a12020-02-03 16:34:28 +090067 base::DoNothing());
Hugo Benichib9b93fe2019-10-25 23:36:01 +090068 std::unique_ptr<SubnetAddress> subnet_addr = subnet.AllocateAtOffset(0);
69 MacAddress mac;
70 std::vector<uint8_t> bytes = provider.ConsumeBytes<uint8_t>(mac.size());
71 std::copy(std::begin(bytes), std::begin(bytes), std::begin(mac));
72
Garrick Evans495dfc42020-02-14 07:20:57 +090073 datapath.AddBridge(ifname, addr, prefix_len);
Hugo Benichib9b93fe2019-10-25 23:36:01 +090074 datapath.RemoveBridge(ifname);
Garrick Evans495dfc42020-02-14 07:20:57 +090075 datapath.AddInboundIPv4DNAT(ifname, addr_str);
76 datapath.RemoveInboundIPv4DNAT(ifname, addr_str);
Garrick Evans2470caa2020-03-04 14:15:41 +090077 datapath.AddVirtualInterfacePair(ifname, bridge);
78 datapath.ToggleInterface(ifname, provider.ConsumeBool());
79 datapath.ConfigureInterface(ifname, mac, addr, prefix_len,
80 provider.ConsumeBool(), provider.ConsumeBool());
Hugo Benichib9b93fe2019-10-25 23:36:01 +090081 datapath.RemoveInterface(ifname);
Garrick Evans4f9f5572019-11-26 10:25:16 +090082 datapath.AddTAP(ifname, &mac, subnet_addr.get(), "");
Hugo Benichib9b93fe2019-10-25 23:36:01 +090083 datapath.RemoveTAP(ifname);
Garrick Evans3d97a392020-02-21 15:24:37 +090084 datapath.AddIPv4Route(provider.ConsumeIntegral<uint32_t>(),
85 provider.ConsumeIntegral<uint32_t>(),
86 provider.ConsumeIntegral<uint32_t>());
Hugo Benichib9b93fe2019-10-25 23:36:01 +090087 }
88
89 return 0;
90}
91
92} // namespace
Garrick Evans3388a032020-03-24 11:25:55 +090093} // namespace patchpanel