Bitcoin Core  24.1.0
P2P Digital Currency
connman.cpp
Go to the documentation of this file.
1 // Copyright (c) 2020-2021 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 <chainparamsbase.h>
8 #include <net.h>
9 #include <netaddress.h>
10 #include <protocol.h>
12 #include <test/fuzz/fuzz.h>
13 #include <test/fuzz/util.h>
14 #include <test/util/setup_common.h>
15 #include <util/system.h>
16 #include <util/translation.h>
17 
18 #include <cstdint>
19 #include <vector>
20 
21 namespace {
22 const TestingSetup* g_setup;
23 } // namespace
24 
26 {
27  static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
28  g_setup = testing_setup.get();
29 }
30 
32 {
33  FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
34  SetMockTime(ConsumeTime(fuzzed_data_provider));
35  CConnman connman{fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
36  fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
37  *g_setup->m_node.addrman,
38  *g_setup->m_node.netgroupman,
39  fuzzed_data_provider.ConsumeBool()};
40  CNetAddr random_netaddr;
41  CNode random_node = ConsumeNode(fuzzed_data_provider);
42  CSubNet random_subnet;
43  std::string random_string;
44  LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
45  CallOneOf(
46  fuzzed_data_provider,
47  [&] {
48  random_netaddr = ConsumeNetAddr(fuzzed_data_provider);
49  },
50  [&] {
51  random_subnet = ConsumeSubNet(fuzzed_data_provider);
52  },
53  [&] {
54  random_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
55  },
56  [&] {
57  connman.AddNode(random_string);
58  },
59  [&] {
60  connman.CheckIncomingNonce(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
61  },
62  [&] {
63  connman.DisconnectNode(fuzzed_data_provider.ConsumeIntegral<NodeId>());
64  },
65  [&] {
66  connman.DisconnectNode(random_netaddr);
67  },
68  [&] {
69  connman.DisconnectNode(random_string);
70  },
71  [&] {
72  connman.DisconnectNode(random_subnet);
73  },
74  [&] {
75  connman.ForEachNode([](auto) {});
76  },
77  [&] {
78  (void)connman.ForNode(fuzzed_data_provider.ConsumeIntegral<NodeId>(), [&](auto) { return fuzzed_data_provider.ConsumeBool(); });
79  },
80  [&] {
81  (void)connman.GetAddresses(
82  /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
83  /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
84  /*network=*/std::nullopt);
85  },
86  [&] {
87  (void)connman.GetAddresses(
88  /*requestor=*/random_node,
89  /*max_addresses=*/fuzzed_data_provider.ConsumeIntegral<size_t>(),
90  /*max_pct=*/fuzzed_data_provider.ConsumeIntegral<size_t>());
91  },
92  [&] {
93  (void)connman.GetDeterministicRandomizer(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
94  },
95  [&] {
96  (void)connman.GetNodeCount(fuzzed_data_provider.PickValueInArray({ConnectionDirection::None, ConnectionDirection::In, ConnectionDirection::Out, ConnectionDirection::Both}));
97  },
98  [&] {
99  (void)connman.OutboundTargetReached(fuzzed_data_provider.ConsumeBool());
100  },
101  [&] {
102  CSerializedNetMsg serialized_net_msg;
103  serialized_net_msg.m_type = fuzzed_data_provider.ConsumeRandomLengthString(CMessageHeader::COMMAND_SIZE);
104  serialized_net_msg.data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
105  connman.PushMessage(&random_node, std::move(serialized_net_msg));
106  },
107  [&] {
108  connman.RemoveAddedNode(random_string);
109  },
110  [&] {
111  connman.SetNetworkActive(fuzzed_data_provider.ConsumeBool());
112  },
113  [&] {
114  connman.SetTryNewOutboundPeer(fuzzed_data_provider.ConsumeBool());
115  });
116  }
117  (void)connman.GetAddedNodeInfo();
118  (void)connman.GetExtraFullOutboundCount();
119  (void)connman.GetLocalServices();
120  (void)connman.GetMaxOutboundTarget();
121  (void)connman.GetMaxOutboundTimeframe();
122  (void)connman.GetMaxOutboundTimeLeftInCycle();
123  (void)connman.GetNetworkActive();
124  std::vector<CNodeStats> stats;
125  connman.GetNodeStats(stats);
126  (void)connman.GetOutboundTargetBytesLeft();
127  (void)connman.GetReceiveFloodSize();
128  (void)connman.GetTotalBytesRecv();
129  (void)connman.GetTotalBytesSent();
130  (void)connman.GetTryNewOutboundPeer();
131  (void)connman.GetUseAddrmanOutgoing();
132 }
std::string m_type
Definition: net.h:123
FUZZ_TARGET_INIT(connman, initialize_connman)
Definition: connman.cpp:31
std::vector< unsigned char > data
Definition: net.h:122
CSubNet ConsumeSubNet(FuzzedDataProvider &fuzzed_data_provider) noexcept
Definition: util.h:280
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
Definition: fuzz.h:18
AddrMan & addrman
Definition: net.h:1005
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
Definition: time.cpp:91
static constexpr size_t COMMAND_SIZE
Definition: protocol.h:30
CNetAddr ConsumeNetAddr(FuzzedDataProvider &fuzzed_data_provider) noexcept
Definition: util.cpp:507
std::vector< uint8_t > ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept
Definition: util.h:110
int64_t NodeId
Definition: net.h:93
Definition: net.h:666
Network address.
Definition: netaddress.h:117
int64_t ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
Definition: util.cpp:307
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
Definition: util.h:89
Information about a peer.
Definition: net.h:347
void initialize_connman()
Definition: connman.cpp:25
auto ConsumeNode(FuzzedDataProvider &fuzzed_data_provider, const std::optional< NodeId > &node_id_in=std::nullopt) noexcept
Definition: util.h:293
Testing setup that configures a complete environment.
Definition: setup_common.h:109