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 : :
24 : 4765 : int32_t GetCheckRatio()
25 : : {
26 [ + - + - ]: 9530 : return std::clamp<int32_t>(g_setup->m_node.args->GetIntArg("-checkaddrman", 0), 0, 1000000);
27 : : }
28 : :
29 : : } // namespace
30 : :
31 : 1 : void initialize_connman()
32 : : {
33 [ + - + - ]: 2 : static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
34 : 1 : g_setup = testing_setup.get();
35 [ + - ]: 2 : }
36 : :
37 [ + - ]: 3544 : FUZZ_TARGET(connman, .init = initialize_connman)
38 : : {
39 : 3132 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
40 : 3132 : SetMockTime(ConsumeTime(fuzzed_data_provider));
41 : 3132 : auto netgroupman{ConsumeNetGroupManager(fuzzed_data_provider)};
42 [ + - + - ]: 3132 : auto addr_man_ptr{std::make_unique<AddrManDeterministic>(netgroupman, fuzzed_data_provider, GetCheckRatio())};
43 [ + + ]: 3132 : if (fuzzed_data_provider.ConsumeBool()) {
44 : 2010 : const std::vector<uint8_t> serialized_data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
45 [ + - ]: 2010 : DataStream ds{serialized_data};
46 : 2010 : try {
47 [ + + ]: 4020 : ds >> *addr_man_ptr;
48 [ - + ]: 1633 : } catch (const std::ios_base::failure&) {
49 [ + - + - ]: 3266 : addr_man_ptr = std::make_unique<AddrManDeterministic>(netgroupman, fuzzed_data_provider, GetCheckRatio());
50 : 1633 : }
51 : 2010 : }
52 : 3132 : AddrManDeterministic& addr_man{*addr_man_ptr};
53 : 3132 : ConnmanTestMsg connman{fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
54 : : fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
55 : : addr_man,
56 : : netgroupman,
57 : : Params(),
58 [ + - + - ]: 3132 : fuzzed_data_provider.ConsumeBool()};
59 : :
60 : 3132 : const uint64_t max_outbound_limit{fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
61 : 3132 : CConnman::Options options;
62 : 3132 : options.nMaxOutboundLimit = max_outbound_limit;
63 [ + - ]: 3132 : connman.Init(options);
64 : :
65 [ + - ]: 3132 : CNetAddr random_netaddr;
66 : 3132 : CNode random_node = ConsumeNode(fuzzed_data_provider);
67 [ + - ]: 3132 : CSubNet random_subnet;
68 : 3132 : std::string random_string;
69 : :
70 [ + + + + ]: 25307 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) {
71 : 22175 : CNode& p2p_node{*ConsumeNodeAsUniquePtr(fuzzed_data_provider).release()};
72 [ + - ]: 22175 : connman.AddTestNode(p2p_node);
73 : : }
74 : :
75 [ + + + + ]: 672294 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
76 [ + - ]: 669162 : CallOneOf(
77 : : fuzzed_data_provider,
78 : 2879 : [&] {
79 : 2879 : random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
80 : 2879 : },
81 : 80588 : [&] {
82 : 80588 : random_subnet = ConsumeSubNet(fuzzed_data_provider);
83 : 80588 : },
84 : 25349 : [&] {
85 : 25349 : random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
86 : 25349 : },
87 : 154382 : [&] {
88 : 154382 : connman.AddNode({random_string, fuzzed_data_provider.ConsumeBool()});
89 [ + - ]: 463146 : },
90 : 1016 : [&] {
91 : 1016 : connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
92 : 1016 : },
93 : 42451 : [&] {
94 : 42451 : connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
95 : 42451 : },
96 : 19364 : [&] {
97 : 19364 : connman.DisconnectNode(random_netaddr);
98 : 19364 : },
99 : 24877 : [&] {
100 : 24877 : connman.DisconnectNode(random_string);
101 : 24877 : },
102 : 10995 : [&] {
103 : 10995 : connman.DisconnectNode(random_subnet);
104 : 10995 : },
105 : 20480 : [&] {
106 [ + - ]: 20480 : connman.ForEachNode([](auto) {});
107 : 20480 : },
108 : 2770 : [&] {
109 [ + - ]: 2770 : (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
110 : 2770 : },
111 : 56012 : [&] {
112 : 56012 : auto max_addresses = fuzzed_data_provider.ConsumeIntegral<size_t>();
113 : 56012 : auto max_pct = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 100);
114 : 56012 : auto filtered = fuzzed_data_provider.ConsumeBool();
115 : 56012 : (void)connman.GetAddresses(max_addresses, max_pct, /*network=*/std::nullopt, filtered);
116 : 56012 : },
117 : 6462 : [&] {
118 : 6462 : auto max_addresses = fuzzed_data_provider.ConsumeIntegral<size_t>();
119 : 6462 : auto max_pct = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 100);
120 : 6462 : (void)connman.GetAddresses(/*requestor=*/random_node, max_addresses, max_pct);
121 : 6462 : },
122 : 2852 : [&] {
123 : 2852 : (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
124 : 2852 : },
125 : 2980 : [&] {
126 : 2980 : (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({ConnectionDirection::None, ConnectionDirection::In, ConnectionDirection::Out, ConnectionDirection::Both}));
127 : 2980 : },
128 : 51158 : [&] {
129 : 51158 : (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
130 : 51158 : },
131 : 56928 : [&] {
132 [ + - ]: 56928 : CSerializedNetMsg serialized_net_msg;
133 [ + - ]: 56928 : serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::MESSAGE_TYPE_SIZE);
134 : 56928 : serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
135 [ + - ]: 56928 : connman.PushMessage(&random_node, std::move(serialized_net_msg));
136 : 56928 : },
137 : 87480 : [&] {
138 : 87480 : connman.RemoveAddedNode(random_string);
139 : 87480 : },
140 : 3637 : [&] {
141 : 3637 : connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
142 : 3637 : },
143 : 16502 : [&] {
144 : 16502 : connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
145 : 16502 : });
146 : : }
147 [ + - ]: 3132 : (void)connman.GetAddedNodeInfo(fuzzed_data_provider.ConsumeBool());
148 [ + - ]: 3132 : (void)connman.GetExtraFullOutboundCount();
149 [ + - ]: 3132 : (void)connman.GetLocalServices();
150 [ + - - + ]: 3132 : assert(connman.GetMaxOutboundTarget() == max_outbound_limit);
151 [ + - ]: 3132 : (void)connman.GetMaxOutboundTimeframe();
152 [ + - ]: 3132 : (void)connman.GetMaxOutboundTimeLeftInCycle();
153 [ + - ]: 3132 : (void)connman.GetNetworkActive();
154 : 3132 : std::vector<CNodeStats> stats;
155 [ + - ]: 3132 : connman.GetNodeStats(stats);
156 [ + - ]: 3132 : (void)connman.GetOutboundTargetBytesLeft();
157 [ + - ]: 3132 : (void)connman.GetTotalBytesRecv();
158 [ + - ]: 3132 : (void)connman.GetTotalBytesSent();
159 [ + - ]: 3132 : (void)connman.GetTryNewOutboundPeer();
160 : 3132 : (void)connman.GetUseAddrmanOutgoing();
161 [ + - ]: 3132 : (void)connman.ASMapHealthCheck();
162 : :
163 [ + - ]: 3132 : connman.ClearTestNodes();
164 : 3132 : }
|