blob: cdbf9f2bdf1aea754c1d585c6a806923f56cb49f [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
Jason Jeremy Imanbb5f2f82020-08-30 19:02:19 +090011#include <base/at_exit.h>
Hugo Benichib9b93fe2019-10-25 23:36:01 +090012#include <base/bind.h>
Garrick Evans495dfc42020-02-14 07:20:57 +090013#include <base/bind_helpers.h>
Hugo Benichib9b93fe2019-10-25 23:36:01 +090014#include <base/logging.h>
15
Garrick Evans3388a032020-03-24 11:25:55 +090016#include "patchpanel/datapath.h"
Jason Jeremy Iman2096b512020-08-20 11:55:12 +090017#include "patchpanel/firewall.h"
Garrick Evans3388a032020-03-24 11:25:55 +090018#include "patchpanel/minijailed_process_runner.h"
19#include "patchpanel/multicast_forwarder.h"
20#include "patchpanel/net_util.h"
Hugo Benichib9b93fe2019-10-25 23:36:01 +090021
Garrick Evans3388a032020-03-24 11:25:55 +090022namespace patchpanel {
Hugo Benichib9b93fe2019-10-25 23:36:01 +090023
24// Always succeeds
25int ioctl_stub(int fd, unsigned long req, ...) {
26 return 0;
27}
28
29class RandomProcessRunner : public MinijailedProcessRunner {
30 public:
31 explicit RandomProcessRunner(FuzzedDataProvider* data_provider)
32 : data_provider_{data_provider} {}
33 ~RandomProcessRunner() = default;
34
35 int Run(const std::vector<std::string>& argv, bool log_failures) override {
36 return data_provider_->ConsumeBool();
37 }
38
Hugo Benichib9b93fe2019-10-25 23:36:01 +090039 private:
40 FuzzedDataProvider* data_provider_;
41
42 DISALLOW_COPY_AND_ASSIGN(RandomProcessRunner);
43};
44
45namespace {
46
47class Environment {
48 public:
49 Environment() {
50 logging::SetMinLogLevel(logging::LOG_FATAL); // <- DISABLE LOGGING.
51 }
Jason Jeremy Imanbb5f2f82020-08-30 19:02:19 +090052 base::AtExitManager at_exit;
Hugo Benichib9b93fe2019-10-25 23:36:01 +090053};
54
55extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
Jason Jeremy Imanbb5f2f82020-08-30 19:02:19 +090056 static Environment env;
Hugo Benichib9b93fe2019-10-25 23:36:01 +090057
58 FuzzedDataProvider provider(data, size);
59 RandomProcessRunner runner(&provider);
Jason Jeremy Iman2096b512020-08-20 11:55:12 +090060 Firewall firewall;
61 Datapath datapath(&runner, &firewall, ioctl_stub);
Hugo Benichib9b93fe2019-10-25 23:36:01 +090062
63 while (provider.remaining_bytes() > 0) {
Hugo Benichi9ab5a052020-07-28 11:29:01 +090064 std::string netns_name = provider.ConsumeRandomLengthString(10);
Hugo Benichib9b93fe2019-10-25 23:36:01 +090065 std::string ifname = provider.ConsumeRandomLengthString(IFNAMSIZ - 1);
Hugo Benichi8d622b52020-08-13 15:24:12 +090066 std::string ifname2 = provider.ConsumeRandomLengthString(IFNAMSIZ - 1);
Hugo Benichib9b93fe2019-10-25 23:36:01 +090067 std::string bridge = provider.ConsumeRandomLengthString(IFNAMSIZ - 1);
Garrick Evans495dfc42020-02-14 07:20:57 +090068 uint32_t addr = provider.ConsumeIntegral<uint32_t>();
69 std::string addr_str = IPv4AddressToString(addr);
70 uint32_t prefix_len = provider.ConsumeIntegralInRange<uint32_t>(0, 31);
71 Subnet subnet(provider.ConsumeIntegral<int32_t>(), prefix_len,
hschamee9e3a12020-02-03 16:34:28 +090072 base::DoNothing());
Hugo Benichib9b93fe2019-10-25 23:36:01 +090073 std::unique_ptr<SubnetAddress> subnet_addr = subnet.AllocateAtOffset(0);
74 MacAddress mac;
75 std::vector<uint8_t> bytes = provider.ConsumeBytes<uint8_t>(mac.size());
76 std::copy(std::begin(bytes), std::begin(bytes), std::begin(mac));
77
Garrick Evans495dfc42020-02-14 07:20:57 +090078 datapath.AddBridge(ifname, addr, prefix_len);
Hugo Benichib9b93fe2019-10-25 23:36:01 +090079 datapath.RemoveBridge(ifname);
Hugo Benichi8d622b52020-08-13 15:24:12 +090080 datapath.StartRoutingDevice(ifname, ifname2, addr,
81 TrafficSource::UNKNOWN);
82 datapath.StopRoutingDevice(ifname, ifname2, addr,
83 TrafficSource::UNKNOWN);
Hugo Benichi9ab5a052020-07-28 11:29:01 +090084 datapath.AddVirtualInterfacePair(netns_name, ifname, bridge);
Garrick Evans2470caa2020-03-04 14:15:41 +090085 datapath.ToggleInterface(ifname, provider.ConsumeBool());
86 datapath.ConfigureInterface(ifname, mac, addr, prefix_len,
87 provider.ConsumeBool(), provider.ConsumeBool());
Hugo Benichib9b93fe2019-10-25 23:36:01 +090088 datapath.RemoveInterface(ifname);
Garrick Evans4f9f5572019-11-26 10:25:16 +090089 datapath.AddTAP(ifname, &mac, subnet_addr.get(), "");
Hugo Benichib9b93fe2019-10-25 23:36:01 +090090 datapath.RemoveTAP(ifname);
Garrick Evans3d97a392020-02-21 15:24:37 +090091 datapath.AddIPv4Route(provider.ConsumeIntegral<uint32_t>(),
92 provider.ConsumeIntegral<uint32_t>(),
93 provider.ConsumeIntegral<uint32_t>());
Hugo Benichib9b93fe2019-10-25 23:36:01 +090094 }
95
96 return 0;
97}
98
99} // namespace
Garrick Evans3388a032020-03-24 11:25:55 +0900100} // namespace patchpanel