Branch data Line data Source code
1 : : // Copyright (c) 2020-2022 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 <addrman.h>
6 : : #include <chainparams.h>
7 : : #include <common/args.h>
8 : : #include <net.h>
9 : : #include <net_processing.h>
10 : : #include <netaddress.h>
11 : : #include <protocol.h>
12 : : #include <test/fuzz/FuzzedDataProvider.h>
13 : : #include <test/fuzz/fuzz.h>
14 : : #include <test/fuzz/util.h>
15 : : #include <test/fuzz/util/net.h>
16 : : #include <test/util/setup_common.h>
17 [ + - ]: 173 : #include <util/translation.h>
18 [ + - ]: 173 :
19 : : #include <cstdint>
20 : : #include <vector>
21 : :
22 : : namespace {
23 : : const TestingSetup* g_setup;
24 : : } // namespace
25 : :
26 : 1 : void initialize_connman()
27 : : {
28 [ + - - + : 1 : static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
+ - ]
29 : 1 : g_setup = testing_setup.get();
30 : 1 : }
31 : :
32 [ + - - + ]: 806 : FUZZ_TARGET(connman, .init = initialize_connman)
33 : : {
34 : 460 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
35 : 460 : SetMockTime(ConsumeTime(fuzzed_data_provider));
36 : :
37 : : // Mock CreateSock() to create FuzzedSock.
38 : 460 : auto CreateSockOrig = CreateSock;
39 [ + - ]: 1172 : CreateSock = [&fuzzed_data_provider](const CService&) {
40 : 712 : return std::make_unique<FuzzedSock>(fuzzed_data_provider);
41 : : };
42 : :
43 : : // Mock g_dns_lookup() to return a fuzzed address.
44 [ + - ]: 460 : auto g_dns_lookup_orig = g_dns_lookup;
45 [ + - ]: 470 : g_dns_lookup = [&fuzzed_data_provider](const std::string&, bool) {
46 [ + - ]: 10 : return std::vector<CNetAddr>{ConsumeNetAddr(fuzzed_data_provider)};
47 : 0 : };
48 : :
49 [ + - + - ]: 920 : ConnmanTestMsg connman{fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
50 [ + - ]: 460 : fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
51 [ + - ]: 460 : *g_setup->m_node.addrman,
52 [ + - ]: 460 : *g_setup->m_node.netgroupman,
53 [ + - ]: 460 : Params(),
54 [ + - ]: 460 : fuzzed_data_provider.ConsumeBool()};
55 : 460 : CConnman::Options options;
56 [ - + ]: 460 : options.m_msgproc = g_setup->m_node.peerman.get();
57 [ + - ]: 460 : connman.Init(options);
58 : :
59 [ + - ]: 460 : CNetAddr random_netaddr;
60 [ + - ]: 460 : CAddress random_address;
61 : 460 : CNode random_node = ConsumeNode(fuzzed_data_provider);
62 [ - + ]: 460 : CSubNet random_subnet;
63 : 460 : std::string random_string;
64 : :
65 [ + - + + : 9126 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) {
+ + ]
66 [ + - ]: 8666 : CNode& p2p_node{*ConsumeNodeAsUniquePtr(fuzzed_data_provider).release()};
67 [ + - ]: 8666 : connman.AddTestNode(p2p_node);
68 : 8666 : }
69 : :
70 [ + - + + : 16518 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
+ + ]
71 [ + - ]: 16058 : CallOneOf(
72 : : fuzzed_data_provider,
73 : 17268 : [&] {
74 : 1383 : random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
75 : 1210 : },
76 : 16266 : [&] {
77 : 208 : random_address = ConsumeAddress(fuzzed_data_provider);
78 : 208 : },
79 : 21695 : [&] {
80 : 5637 : random_subnet = ConsumeSubNet(fuzzed_data_provider);
81 : 5637 : },
82 : 17413 : [&] {
83 [ + - ]: 1528 : random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
84 : 1355 : },
85 : 16479 : [&] {
86 [ + - - + ]: 421 : connman.AddNode({random_string, fuzzed_data_provider.ConsumeBool()});
87 : 421 : },
88 : 16234 : [&] {
89 : 176 : connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
90 : 176 : },
91 : 16362 : [&] {
92 : 304 : connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
93 : 304 : },
94 : 16304 : [&] {
95 : 246 : connman.DisconnectNode(random_netaddr);
96 : 246 : },
97 : 17550 : [&] {
98 : 1492 : connman.DisconnectNode(random_string);
99 : 1492 : },
100 : 16174 : [&] {
101 : 116 : connman.DisconnectNode(random_subnet);
102 : 116 : },
103 : 16069 : [&] {
104 [ + - ]: 11 : connman.ForEachNode([](auto) {});
105 : 11 : },
106 : 16112 : [&] {
107 [ + - ]: 54 : (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
108 : 54 : },
109 : 16071 : [&] {
110 : 26 : (void)connman.GetAddresses(
111 : 13 : /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
112 : 13 : /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
113 : 13 : /*network=*/std::nullopt);
114 : 13 : },
115 : 16138 : [&] {
116 : 160 : (void)connman.GetAddresses(
117 : 80 : /*requestor=*/random_node,
118 : 80 : /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
119 : 80 : /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>());
120 : 80 : },
121 : 16080 : [&] {
122 : 22 : (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
123 : 22 : },
124 : 16364 : [&] {
125 : 306 : (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({ConnectionDirection::None, ConnectionDirection::In, ConnectionDirection::Out, ConnectionDirection::Both}));
126 : 306 : },
127 : 16202 : [&] {
128 : 144 : (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
129 : 144 : },
130 : 18890 : [&] {
131 : 2832 : CSerializedNetMsg serialized_net_msg;
132 [ + - ]: 2832 : serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::COMMAND_SIZE);
133 : 2832 : serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
134 [ + - ]: 2832 : connman.PushMessage(&random_node, std::move(serialized_net_msg));
135 : 2832 : },
136 : 16253 : [&] {
137 : 195 : connman.RemoveAddedNode(random_string);
138 : 195 : },
139 : 16153 : [&] {
140 : 95 : connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
141 : 95 : },
142 : 16147 : [&] {
143 : 89 : connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
144 : 89 : },
145 : 16469 : [&] {
146 : 411 : ConnectionType conn_type{
147 : 411 : fuzzed_data_provider.PickValueInArray(ALL_CONNECTION_TYPES)};
148 [ + + ]: 411 : if (conn_type == ConnectionType::INBOUND) { // INBOUND is not allowed
149 : 5 : conn_type = ConnectionType::OUTBOUND_FULL_RELAY;
150 : 5 : }
151 : :
152 [ + - ]: 822 : connman.OpenNetworkConnection(
153 : 411 : /*addrConnect=*/random_address,
154 : 411 : /*fCountFailure=*/fuzzed_data_provider.ConsumeBool(),
155 : 411 : /*grant_outbound=*/CSemaphoreGrant{},
156 [ + - + + ]: 411 : /*strDest=*/fuzzed_data_provider.ConsumeBool() ? nullptr : random_string.c_str(),
157 : 411 : /*conn_type=*/conn_type,
158 [ + - ]: 411 : /*use_v2transport=*/fuzzed_data_provider.ConsumeBool());
159 : 411 : },
160 : 16606 : [&] {
161 : 548 : connman.SetNetworkActive(true);
162 : 548 : const auto peer = ConsumeAddress(fuzzed_data_provider);
163 [ - + ]: 548 : connman.CreateNodeFromAcceptedSocketPublic(
164 [ + - ]: 548 : /*sock=*/CreateSock(peer),
165 : 548 : /*permissions=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS),
166 : 548 : /*addr_bind=*/ConsumeAddress(fuzzed_data_provider),
167 : : /*addr_peer=*/peer);
168 : 548 : },
169 : 16097 : [&] {
170 : 39 : CConnman::Options options;
171 : :
172 : 39 : options.vBinds = ConsumeServiceVector(fuzzed_data_provider, 5);
173 : :
174 [ + - ]: 39 : options.vWhiteBinds = std::vector<NetWhitebindPermissions>{
175 : 39 : fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 5)};
176 [ + + ]: 119 : for (auto& wb : options.vWhiteBinds) {
177 : 80 : wb.m_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
178 : 80 : wb.m_service = ConsumeService(fuzzed_data_provider);
179 : : }
180 : :
181 : 39 : options.onion_binds = ConsumeServiceVector(fuzzed_data_provider, 5);
182 : :
183 [ + + + + ]: 40 : options.bind_on_any = options.vBinds.empty() && options.vWhiteBinds.empty() &&
184 : 1 : options.onion_binds.empty();
185 : :
186 [ - + ]: 39 : connman.InitBindsPublic(options);
187 : 39 : },
188 : 16112 : [&] {
189 : 54 : connman.SocketHandlerPublic();
190 : 54 : });
191 : 16058 : }
192 [ + - ]: 460 : (void)connman.GetAddedNodeInfo();
193 [ + - ]: 460 : (void)connman.GetExtraFullOutboundCount();
194 [ + - ]: 460 : (void)connman.GetLocalServices();
195 [ + - ]: 460 : (void)connman.GetMaxOutboundTarget();
196 [ + - ]: 460 : (void)connman.GetMaxOutboundTimeframe();
197 [ + - ]: 460 : (void)connman.GetMaxOutboundTimeLeftInCycle();
198 [ + - ]: 460 : (void)connman.GetNetworkActive();
199 : 460 : std::vector<CNodeStats> stats;
200 [ + - ]: 460 : connman.GetNodeStats(stats);
201 [ + - ]: 460 : (void)connman.GetOutboundTargetBytesLeft();
202 [ + - ]: 460 : (void)connman.GetTotalBytesRecv();
203 [ + - ]: 460 : (void)connman.GetTotalBytesSent();
204 [ + - ]: 460 : (void)connman.GetTryNewOutboundPeer();
205 [ + - ]: 460 : (void)connman.GetUseAddrmanOutgoing();
206 : :
207 [ + - ]: 460 : connman.ClearTestNodes();
208 [ + - ]: 460 : g_dns_lookup = g_dns_lookup_orig;
209 [ + - ]: 460 : CreateSock = CreateSockOrig;
210 : 460 : }
|