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); 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 2 : }, 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 : }