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 [ + - ]: 2 :
18 [ + - ]: 2 : #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 [ + - ]: 4 : 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 : 0 : fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
37 : 0 : *g_setup->m_node.addrman,
38 : 0 : *g_setup->m_node.netgroupman,
39 : 0 : Params(),
40 : 0 : fuzzed_data_provider.ConsumeBool()};
41 [ # # ]: 0 : CNetAddr random_netaddr;
42 : 0 : CNode random_node = ConsumeNode(fuzzed_data_provider);
43 [ # # ]: 0 : CSubNet random_subnet;
44 : 0 : std::string random_string;
45 : :
46 [ # # ][ # # ]: 0 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) {
[ # # ]
47 [ # # ]: 0 : CNode& p2p_node{*ConsumeNodeAsUniquePtr(fuzzed_data_provider).release()};
48 [ # # ]: 0 : connman.AddTestNode(p2p_node);
49 : 0 : }
50 : :
51 [ # # ][ # # ]: 0 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
[ # # ]
52 [ # # ]: 0 : CallOneOf(
53 : : fuzzed_data_provider,
54 : 0 : [&] {
55 : 0 : random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
56 : 0 : },
57 : 0 : [&] {
58 : 0 : random_subnet = ConsumeSubNet(fuzzed_data_provider);
59 : 0 : },
60 : 0 : [&] {
61 : 0 : random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
62 : 0 : },
63 : 0 : [&] {
64 [ # # ][ # # ]: 0 : connman.AddNode({random_string, fuzzed_data_provider.ConsumeBool()});
65 : 0 : },
66 : 0 : [&] {
67 : 0 : connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
68 : 0 : },
69 : 0 : [&] {
70 : 0 : connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
71 : 0 : },
72 : 0 : [&] {
73 : 0 : connman.DisconnectNode(random_netaddr);
74 : 0 : },
75 : 0 : [&] {
76 : 0 : connman.DisconnectNode(random_string);
77 : 0 : },
78 : 0 : [&] {
79 : 0 : connman.DisconnectNode(random_subnet);
80 : 0 : },
81 : 0 : [&] {
82 [ # # ]: 0 : connman.ForEachNode([](auto) {});
83 [ + - ]: 2 : },
84 : 0 : [&] {
85 [ # # ]: 0 : (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
86 : 0 : },
87 : 0 : [&] {
88 : 0 : (void)connman.GetAddresses(
89 : 0 : /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
90 : 0 : /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
91 : 0 : /*network=*/std::nullopt);
92 : 0 : },
93 : 0 : [&] {
94 : 0 : (void)connman.GetAddresses(
95 : 0 : /*requestor=*/random_node,
96 : 0 : /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
97 : 0 : /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>());
98 : 0 : },
99 : 0 : [&] {
100 : 0 : (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
101 : 0 : },
102 : 0 : [&] {
103 : 0 : (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({ConnectionDirection::None, ConnectionDirection::In, ConnectionDirection::Out, ConnectionDirection::Both}));
104 : 0 : },
105 : 0 : [&] {
106 : 0 : (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
107 : 0 : },
108 : 0 : [&] {
109 : 0 : CSerializedNetMsg serialized_net_msg;
110 [ # # ]: 0 : serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::COMMAND_SIZE);
111 : 0 : serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
112 [ # # ]: 0 : connman.PushMessage(&random_node, std::move(serialized_net_msg));
113 : 0 : },
114 : 0 : [&] {
115 : 0 : connman.RemoveAddedNode(random_string);
116 : 0 : },
117 : 0 : [&] {
118 : 0 : connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
119 : 0 : },
120 : 0 : [&] {
121 : 0 : connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
122 : 0 : });
123 : 0 : }
124 [ # # ]: 0 : (void)connman.GetAddedNodeInfo();
125 [ # # ]: 0 : (void)connman.GetExtraFullOutboundCount();
126 [ # # ]: 0 : (void)connman.GetLocalServices();
127 [ # # ]: 0 : (void)connman.GetMaxOutboundTarget();
128 [ # # ]: 0 : (void)connman.GetMaxOutboundTimeframe();
129 [ # # ]: 0 : (void)connman.GetMaxOutboundTimeLeftInCycle();
130 [ # # ]: 0 : (void)connman.GetNetworkActive();
131 : 0 : std::vector<CNodeStats> stats;
132 [ # # ]: 0 : connman.GetNodeStats(stats);
133 [ # # ]: 0 : (void)connman.GetOutboundTargetBytesLeft();
134 [ # # ]: 0 : (void)connman.GetTotalBytesRecv();
135 [ # # ]: 0 : (void)connman.GetTotalBytesSent();
136 [ # # ]: 0 : (void)connman.GetTryNewOutboundPeer();
137 [ # # ]: 0 : (void)connman.GetUseAddrmanOutgoing();
138 : :
139 [ # # ]: 0 : connman.ClearTestNodes();
140 : 0 : }
|