net.cpp
1 // Copyright (c) 2020-present 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 <chainparams.h> 6 #include <net.h> 7 #include <net_permissions.h> 8 #include <netaddress.h> 9 #include <protocol.h> 10 #include <random.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/net.h> 16 #include <test/util/setup_common.h> 17 #include <test/util/time.h> 18 #include <util/asmap.h> 19 #include <util/chaintype.h> 20 #include <util/time.h> 21 22 #include <cstdint> 23 #include <optional> 24 #include <string> 25 #include <vector> 26 27 void initialize_net() 28 { 29 static const auto testing_setup = MakeNoLogFileContext<>(ChainType::MAIN); 30 } 31 32 FUZZ_TARGET(net, .init = initialize_net) 33 { 34 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); 35 NodeClockContext clock_ctx{ConsumeTime(fuzzed_data_provider)}; 36 CNode node{ConsumeNode(fuzzed_data_provider)}; 37 node.SetCommonVersion(fuzzed_data_provider.ConsumeIntegral<int>()); 38 if (const auto service_opt = 39 ConsumeDeserializable<CService>(fuzzed_data_provider, ConsumeDeserializationParams<CNetAddr::SerParams>(fuzzed_data_provider))) 40 { 41 node.SetAddrLocal(*service_opt); 42 } 43 LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) { 44 CallOneOf( 45 fuzzed_data_provider, 46 [&] { 47 node.CloseSocketDisconnect(); 48 }, 49 [&] { 50 CNodeStats stats; 51 node.CopyStats(stats); 52 }, 53 [&] { 54 const CNode* add_ref_node = node.AddRef(); 55 assert(add_ref_node == &node); 56 }, 57 [&] { 58 if (node.GetRefCount() > 0) { 59 node.Release(); 60 } 61 }, 62 [&] { 63 const std::vector<uint8_t> b = ConsumeRandomLengthByteVector(fuzzed_data_provider); 64 bool complete; 65 node.ReceiveMsgBytes(b, complete); 66 }); 67 } 68 69 (void)node.GetAddrLocal(); 70 (void)node.GetId(); 71 (void)node.GetLocalNonce(); 72 const int ref_count = node.GetRefCount(); 73 assert(ref_count >= 0); 74 (void)node.GetCommonVersion(); 75 76 const NetPermissionFlags net_permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS); 77 (void)node.HasPermission(net_permission_flags); 78 (void)node.ConnectedThroughNetwork(); 79 } 80 81 FUZZ_TARGET(local_address, .init = initialize_net) 82 { 83 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); 84 NodeClockContext clock_ctx{ConsumeTime(fuzzed_data_provider)}; 85 CService service{ConsumeService(fuzzed_data_provider)}; 86 CNode node{ConsumeNode(fuzzed_data_provider)}; 87 { 88 LOCK(g_maplocalhost_mutex); 89 mapLocalHost.clear(); 90 } 91 LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) { 92 CallOneOf( 93 fuzzed_data_provider, 94 [&] { 95 service = ConsumeService(fuzzed_data_provider); 96 }, 97 [&] { 98 const bool added{AddLocal(service, fuzzed_data_provider.ConsumeIntegralInRange<int>(0, LOCAL_MAX - 1))}; 99 if (!added) return; 100 assert(service.IsRoutable()); 101 assert(IsLocal(service)); 102 assert(SeenLocal(service)); 103 }, 104 [&] { 105 (void)RemoveLocal(service); 106 }, 107 [&] { 108 (void)SeenLocal(service); 109 }, 110 [&] { 111 (void)IsLocal(service); 112 }, 113 [&] { 114 (void)GetLocalAddress(node); 115 }); 116 } 117 }