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 [ + - ]: 2 : #include <util/translation.h>
18 [ + - ]: 2 :
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 [ + - - + ]: 4015 : FUZZ_TARGET(connman, .init = initialize_connman)
33 : : {
34 : 4011 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
35 : 4011 : SetMockTime(ConsumeTime(fuzzed_data_provider));
36 : :
37 : : // Mock CreateSock() to create FuzzedSock.
38 : 4011 : auto CreateSockOrig = CreateSock;
39 [ + - ]: 20388 : CreateSock = [&fuzzed_data_provider](const CService&) {
40 : 16377 : return std::make_unique<FuzzedSock>(fuzzed_data_provider);
41 : : };
42 : :
43 : : // Mock g_dns_lookup() to return a fuzzed address.
44 [ + - ]: 4011 : auto g_dns_lookup_orig = g_dns_lookup;
45 [ + - ]: 6337 : g_dns_lookup = [&fuzzed_data_provider](const std::string&, bool) {
46 [ + - ]: 2326 : return std::vector<CNetAddr>{ConsumeNetAddr(fuzzed_data_provider)};
47 : 0 : };
48 : :
49 [ + - + - ]: 8022 : ConnmanTestMsg connman{fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
50 [ + - ]: 4011 : fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
51 [ + - ]: 4011 : *g_setup->m_node.addrman,
52 [ + - ]: 4011 : *g_setup->m_node.netgroupman,
53 [ + - ]: 4011 : Params(),
54 [ + - ]: 4011 : fuzzed_data_provider.ConsumeBool()};
55 : 4011 : CConnman::Options options;
56 [ - + ]: 4011 : options.m_msgproc = g_setup->m_node.peerman.get();
57 [ + - ]: 4011 : connman.Init(options);
58 : :
59 [ + - ]: 4011 : CNetAddr random_netaddr;
60 [ + - ]: 4011 : CAddress random_address;
61 : 4011 : CNode random_node = ConsumeNode(fuzzed_data_provider);
62 [ - + ]: 4011 : CSubNet random_subnet;
63 : 4011 : std::string random_string;
64 : :
65 [ + - + + : 5449 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) {
+ + ]
66 [ + - ]: 1438 : CNode& p2p_node{*ConsumeNodeAsUniquePtr(fuzzed_data_provider).release()};
67 [ + - ]: 1438 : connman.AddTestNode(p2p_node);
68 : 1438 : }
69 : :
70 [ + - + + : 62715 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
+ + ]
71 [ + - ]: 58704 : CallOneOf(
72 : : fuzzed_data_provider,
73 : 59734 : [&] {
74 : 1032 : random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
75 : 1030 : },
76 : 60551 : [&] {
77 : 1847 : random_address = ConsumeAddress(fuzzed_data_provider);
78 : 1847 : },
79 : 59142 : [&] {
80 : 438 : random_subnet = ConsumeSubNet(fuzzed_data_provider);
81 : 438 : },
82 : 60749 : [&] {
83 [ + - ]: 2047 : random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
84 : 2045 : },
85 : 63119 : [&] {
86 [ + - - + ]: 4415 : connman.AddNode({random_string, fuzzed_data_provider.ConsumeBool()});
87 : 4415 : },
88 : 61481 : [&] {
89 : 2777 : connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
90 : 2777 : },
91 : 59170 : [&] {
92 : 466 : connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
93 : 466 : },
94 : 61509 : [&] {
95 : 2805 : connman.DisconnectNode(random_netaddr);
96 : 2805 : },
97 : 59839 : [&] {
98 : 1135 : connman.DisconnectNode(random_string);
99 : 1135 : },
100 : 59995 : [&] {
101 : 1291 : connman.DisconnectNode(random_subnet);
102 : 1291 : },
103 : 62666 : [&] {
104 [ + - ]: 3962 : connman.ForEachNode([](auto) {});
105 : 3962 : },
106 : 59048 : [&] {
107 [ + - ]: 344 : (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
108 : 344 : },
109 : 58946 : [&] {
110 : 484 : (void)connman.GetAddresses(
111 : 242 : /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
112 : 242 : /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
113 : 242 : /*network=*/std::nullopt);
114 : 242 : },
115 : 59484 : [&] {
116 : 1560 : (void)connman.GetAddresses(
117 : 780 : /*requestor=*/random_node,
118 : 780 : /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
119 : 780 : /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>());
120 : 780 : },
121 : 59583 : [&] {
122 : 879 : (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
123 : 879 : },
124 : 60167 : [&] {
125 : 1463 : (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({ConnectionDirection::None, ConnectionDirection::In, ConnectionDirection::Out, ConnectionDirection::Both}));
126 : 1463 : },
127 : 59300 : [&] {
128 : 596 : (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
129 : 596 : },
130 : 61124 : [&] {
131 : 2420 : CSerializedNetMsg serialized_net_msg;
132 [ + - ]: 2420 : serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::COMMAND_SIZE);
133 : 2420 : serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
134 [ + - ]: 2420 : connman.PushMessage(&random_node, std::move(serialized_net_msg));
135 : 2420 : },
136 : 66783 : [&] {
137 : 8079 : connman.RemoveAddedNode(random_string);
138 : 8079 : },
139 : 59175 : [&] {
140 : 471 : connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
141 : 471 : },
142 : 59726 : [&] {
143 : 1022 : connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
144 : 1022 : },
145 : 74611 : [&] {
146 : 15907 : ConnectionType conn_type{
147 : 15907 : fuzzed_data_provider.PickValueInArray(ALL_CONNECTION_TYPES)};
148 [ + + ]: 15907 : if (conn_type == ConnectionType::INBOUND) { // INBOUND is not allowed
149 : 1737 : conn_type = ConnectionType::OUTBOUND_FULL_RELAY;
150 : 1737 : }
151 : :
152 [ + - ]: 31814 : connman.OpenNetworkConnection(
153 : 15907 : /*addrConnect=*/random_address,
154 : 15907 : /*fCountFailure=*/fuzzed_data_provider.ConsumeBool(),
155 : 15907 : /*grant_outbound=*/CSemaphoreGrant{},
156 [ + - + + ]: 15907 : /*strDest=*/fuzzed_data_provider.ConsumeBool() ? nullptr : random_string.c_str(),
157 : 15907 : /*conn_type=*/conn_type,
158 [ + - ]: 15907 : /*use_v2transport=*/fuzzed_data_provider.ConsumeBool());
159 : 15907 : },
160 : 59171 : [&] {
161 : 467 : connman.SetNetworkActive(true);
162 : 467 : const auto peer = ConsumeAddress(fuzzed_data_provider);
163 [ - + ]: 467 : connman.CreateNodeFromAcceptedSocketPublic(
164 [ + - ]: 467 : /*sock=*/CreateSock(peer),
165 : 467 : /*permissions=*/ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS),
166 : 467 : /*addr_bind=*/ConsumeAddress(fuzzed_data_provider),
167 : : /*addr_peer=*/peer);
168 : 467 : },
169 : 59668 : [&] {
170 : 964 : CConnman::Options options;
171 : :
172 : 964 : options.vBinds = ConsumeServiceVector(fuzzed_data_provider, 5);
173 : :
174 [ + - ]: 964 : options.vWhiteBinds = std::vector<NetWhitebindPermissions>{
175 : 964 : fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 5)};
176 [ + + ]: 2421 : for (auto& wb : options.vWhiteBinds) {
177 : 1457 : wb.m_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
178 : 1457 : wb.m_service = ConsumeService(fuzzed_data_provider);
179 : : }
180 : :
181 : 964 : options.onion_binds = ConsumeServiceVector(fuzzed_data_provider, 5);
182 : :
183 [ + + + + ]: 1159 : options.bind_on_any = options.vBinds.empty() && options.vWhiteBinds.empty() &&
184 : 195 : options.onion_binds.empty();
185 : :
186 [ - + ]: 964 : connman.InitBindsPublic(options);
187 : 964 : },
188 : 61563 : [&] {
189 : 2859 : connman.SocketHandlerPublic();
190 : 2859 : });
191 : 58704 : }
192 [ + - ]: 4011 : (void)connman.GetAddedNodeInfo();
193 [ + - ]: 4011 : (void)connman.GetExtraFullOutboundCount();
194 [ + - ]: 4011 : (void)connman.GetLocalServices();
195 [ + - ]: 4011 : (void)connman.GetMaxOutboundTarget();
196 [ + - ]: 4011 : (void)connman.GetMaxOutboundTimeframe();
197 [ + - ]: 4011 : (void)connman.GetMaxOutboundTimeLeftInCycle();
198 [ + - ]: 4011 : (void)connman.GetNetworkActive();
199 : 4011 : std::vector<CNodeStats> stats;
200 [ + - ]: 4011 : connman.GetNodeStats(stats);
201 [ + - ]: 4011 : (void)connman.GetOutboundTargetBytesLeft();
202 [ + - ]: 4011 : (void)connman.GetTotalBytesRecv();
203 [ + - ]: 4011 : (void)connman.GetTotalBytesSent();
204 [ + - ]: 4011 : (void)connman.GetTryNewOutboundPeer();
205 [ + - ]: 4011 : (void)connman.GetUseAddrmanOutgoing();
206 : :
207 [ + - ]: 4011 : connman.ClearTestNodes();
208 [ + - ]: 4011 : g_dns_lookup = g_dns_lookup_orig;
209 [ + - ]: 4011 : CreateSock = CreateSockOrig;
210 : 4011 : }
|