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