net.cpp raw
1 // Copyright (c) 2020-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #include <chainparams.h>
6 #include <net.h>
7 #include <net_permissions.h>
8 #include <netaddress.h>
9 #include <protocol.h>
10 #include <random.h>
11 #include <test/fuzz/FuzzedDataProvider.h>
12 #include <test/fuzz/fuzz.h>
13 #include <test/fuzz/util.h>
14 #include <test/fuzz/util/net.h>
15 #include <test/util/net.h>
16 #include <test/util/setup_common.h>
17 #include <test/util/time.h>
18 #include <util/asmap.h>
19 #include <util/chaintype.h>
20 #include <util/time.h>
21
22 #include <cstdint>
23 #include <optional>
24 #include <string>
25 #include <vector>
26
27 void initialize_net()
28 {
29 static const auto testing_setup = MakeNoLogFileContext<>(ChainType::MAIN);
30 }
31
32 FUZZ_TARGET(net, .init = initialize_net)
33 {
34 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
35 FakeNodeClock clock{ConsumeTime(fuzzed_data_provider)};
36 FakeSteadyClock steady_clock;
37 CNode node{ConsumeNode(fuzzed_data_provider, steady_clock)};
38 node.SetCommonVersion(fuzzed_data_provider.ConsumeIntegral<int>());
39 if (const auto service_opt =
40 ConsumeDeserializable<CService>(fuzzed_data_provider, ConsumeDeserializationParams<CNetAddr::SerParams>(fuzzed_data_provider)))
41 {
42 node.SetAddrLocal(*service_opt);
43 }
44 LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
45 CallOneOf(
46 fuzzed_data_provider,
47 [&] {
48 node.CloseSocketDisconnect();
49 },
50 [&] {
51 CNodeStats stats;
52 node.CopyStats(stats);
53 },
54 [&] {
55 const CNode* add_ref_node = node.AddRef();
56 assert(add_ref_node == &node);
57 },
58 [&] {
59 if (node.GetRefCount() > 0) {
60 node.Release();
61 }
62 },
63 [&] {
64 const std::vector<uint8_t> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
65 bool complete;
66 node.ReceiveMsgBytes(b, complete);
67 });
68 }
69
70 (void)node.GetAddrLocal();
71 (void)node.GetId();
72 (void)node.GetLocalNonce();
73 const int ref_count = node.GetRefCount();
74 assert(ref_count >= 0);
75 (void)node.GetCommonVersion();
76
77 const NetPermissionFlags net_permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
78 (void)node.HasPermission(net_permission_flags);
79 (void)node.ConnectedThroughNetwork();
80 }
81
82 FUZZ_TARGET(local_address, .init = initialize_net)
83 {
84 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
85 FakeNodeClock clock{ConsumeTime(fuzzed_data_provider)};
86 FakeSteadyClock steady_clock;
87 CService service{ConsumeService(fuzzed_data_provider)};
88 CNode node{ConsumeNode(fuzzed_data_provider, steady_clock)};
89 {
90 LOCK(g_maplocalhost_mutex);
91 mapLocalHost.clear();
92 }
93 LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
94 CallOneOf(
95 fuzzed_data_provider,
96 [&] {
97 service = ConsumeService(fuzzed_data_provider);
98 },
99 [&] {
100 const bool added{AddLocal(service, fuzzed_data_provider.ConsumeIntegralInRange<int>(0, LOCAL_MAX - 1))};
101 if (!added) return;
102 assert(service.IsRoutable());
103 assert(IsLocal(service));
104 assert(SeenLocal(service));
105 },
106 [&] {
107 (void)RemoveLocal(service);
108 },
109 [&] {
110 (void)SeenLocal(service);
111 },
112 [&] {
113 (void)IsLocal(service);
114 },
115 [&] {
116 (void)GetLocalAddress(node);
117 });
118 }
119 }
120