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 <netaddress.h>
10 : : #include <protocol.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/setup_common.h>
16 : : #include <util/translation.h>
17 : :
18 : : #include <cstdint>
19 : : #include <vector>
20 : :
21 : : namespace {
22 : : const TestingSetup* g_setup;
23 : : } // namespace
24 : :
25 : 0 : void initialize_connman()
26 : : {
27 [ # # # # ]: 0 : static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
28 : 0 : g_setup = testing_setup.get();
29 [ # # ]: 0 : }
30 : :
31 [ # # ]: 0 : FUZZ_TARGET(connman, .init = initialize_connman)
32 : : {
33 : 0 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
34 : 0 : SetMockTime(ConsumeTime(fuzzed_data_provider));
35 : 0 : ConnmanTestMsg connman{fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
36 : : fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
37 : 0 : *g_setup->m_node.addrman,
38 : 0 : *g_setup->m_node.netgroupman,
39 : : Params(),
40 : 0 : fuzzed_data_provider.ConsumeBool()};
41 : :
42 : 0 : const uint64_t max_outbound_limit{fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
43 : 0 : CConnman::Options options;
44 : 0 : options.nMaxOutboundLimit = max_outbound_limit;
45 [ # # ]: 0 : connman.Init(options);
46 : :
47 [ # # ]: 0 : CNetAddr random_netaddr;
48 : 0 : CNode random_node = ConsumeNode(fuzzed_data_provider);
49 [ # # ]: 0 : CSubNet random_subnet;
50 : 0 : std::string random_string;
51 : :
52 [ # # # # ]: 0 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) {
53 : 0 : CNode& p2p_node{*ConsumeNodeAsUniquePtr(fuzzed_data_provider).release()};
54 [ # # ]: 0 : connman.AddTestNode(p2p_node);
55 : : }
56 : :
57 [ # # # # ]: 0 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
58 [ # # ]: 0 : CallOneOf(
59 : : fuzzed_data_provider,
60 : 0 : [&] {
61 : 0 : random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
62 : 0 : },
63 : 0 : [&] {
64 : 0 : random_subnet = ConsumeSubNet(fuzzed_data_provider);
65 : 0 : },
66 : 0 : [&] {
67 : 0 : random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
68 : 0 : },
69 : 0 : [&] {
70 : 0 : connman.AddNode({random_string, fuzzed_data_provider.ConsumeBool()});
71 [ # # ]: 0 : },
72 : 0 : [&] {
73 : 0 : connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
74 : 0 : },
75 : 0 : [&] {
76 : 0 : connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
77 : 0 : },
78 : 0 : [&] {
79 : 0 : connman.DisconnectNode(random_netaddr);
80 : 0 : },
81 : 0 : [&] {
82 : 0 : connman.DisconnectNode(random_string);
83 : 0 : },
84 : 0 : [&] {
85 : 0 : connman.DisconnectNode(random_subnet);
86 : 0 : },
87 : 0 : [&] {
88 [ # # ]: 0 : connman.ForEachNode([](auto) {});
89 : 0 : },
90 : 0 : [&] {
91 [ # # ]: 0 : (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
92 : 0 : },
93 : 0 : [&] {
94 : 0 : (void)connman.GetAddresses(
95 : : /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
96 : : /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
97 : : /*network=*/std::nullopt,
98 : 0 : /*filtered=*/fuzzed_data_provider.ConsumeBool());
99 : 0 : },
100 : 0 : [&] {
101 : 0 : (void)connman.GetAddresses(
102 : : /*requestor=*/random_node,
103 : : /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
104 : : /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>());
105 : 0 : },
106 : 0 : [&] {
107 : 0 : (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
108 : 0 : },
109 : 0 : [&] {
110 : 0 : (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({ConnectionDirection::None, ConnectionDirection::In, ConnectionDirection::Out, ConnectionDirection::Both}));
111 : 0 : },
112 : 0 : [&] {
113 : 0 : (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
114 : 0 : },
115 : 0 : [&] {
116 [ # # ]: 0 : CSerializedNetMsg serialized_net_msg;
117 [ # # ]: 0 : serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::COMMAND_SIZE);
118 : 0 : serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
119 [ # # ]: 0 : connman.PushMessage(&random_node, std::move(serialized_net_msg));
120 : 0 : },
121 : 0 : [&] {
122 : 0 : connman.RemoveAddedNode(random_string);
123 : 0 : },
124 : 0 : [&] {
125 : 0 : connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
126 : 0 : },
127 : 0 : [&] {
128 : 0 : connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
129 : 0 : });
130 : : }
131 [ # # ]: 0 : (void)connman.GetAddedNodeInfo(fuzzed_data_provider.ConsumeBool());
132 [ # # ]: 0 : (void)connman.GetExtraFullOutboundCount();
133 [ # # ]: 0 : (void)connman.GetLocalServices();
134 [ # # # # ]: 0 : assert(connman.GetMaxOutboundTarget() == max_outbound_limit);
135 [ # # ]: 0 : (void)connman.GetMaxOutboundTimeframe();
136 [ # # ]: 0 : (void)connman.GetMaxOutboundTimeLeftInCycle();
137 [ # # ]: 0 : (void)connman.GetNetworkActive();
138 : 0 : std::vector<CNodeStats> stats;
139 [ # # ]: 0 : connman.GetNodeStats(stats);
140 [ # # ]: 0 : (void)connman.GetOutboundTargetBytesLeft();
141 [ # # ]: 0 : (void)connman.GetTotalBytesRecv();
142 [ # # ]: 0 : (void)connman.GetTotalBytesSent();
143 [ # # ]: 0 : (void)connman.GetTryNewOutboundPeer();
144 : 0 : (void)connman.GetUseAddrmanOutgoing();
145 : :
146 [ # # ]: 0 : connman.ClearTestNodes();
147 : 0 : }
|