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 : 0 : void initialize_net()
26 : : {
27 [ # # # # : 0 : static const auto testing_setup = MakeNoLogFileContext<>(ChainType::MAIN);
# # ]
28 : 0 : }
29 : :
30 [ + - ]: 2703 : FUZZ_TARGET(net, .init = initialize_net)
31 : : {
32 : 2701 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
33 : 2701 : SetMockTime(ConsumeTime(fuzzed_data_provider));
34 : 2701 : CNode node{ConsumeNode(fuzzed_data_provider)};
35 [ + - + - ]: 2701 : node.SetCommonVersion(fuzzed_data_provider.ConsumeIntegral<int>());
36 [ + + + + ]: 6075 : if (const auto service_opt =
37 : 2701 : ConsumeDeserializable<CService>(fuzzed_data_provider, ConsumeDeserializationParams<CNetAddr::SerParams>(fuzzed_data_provider)))
38 : : {
39 [ + - ]: 673 : node.SetAddrLocal(*service_opt);
40 : 673 : }
41 [ + - + + : 500699 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
+ + ]
42 [ + - ]: 497998 : CallOneOf(
43 : : fuzzed_data_provider,
44 : 518676 : [&] {
45 : 20678 : node.CloseSocketDisconnect();
46 : 20678 : },
47 : 909504 : [&] {
48 : 411506 : CNodeStats stats;
49 [ + - ]: 411506 : node.CopyStats(stats);
50 : 411506 : },
51 : 523905 : [&] {
52 : 25907 : const CNode* add_ref_node = node.AddRef();
53 [ + - ]: 25907 : assert(add_ref_node == &node);
54 : 25907 : },
55 : 506630 : [&] {
56 [ + + ]: 8632 : if (node.GetRefCount() > 0) {
57 : 512 : node.Release();
58 : 512 : }
59 : 8632 : },
60 : 529273 : [&] {
61 : 31275 : const std::vector<uint8_t> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
62 : 31275 : bool complete;
63 [ + - + - ]: 31275 : node.ReceiveMsgBytes(b, complete);
64 : 31275 : });
65 : 497998 : }
66 : :
67 [ + - ]: 2701 : (void)node.GetAddrLocal();
68 [ + - ]: 2701 : (void)node.GetId();
69 [ + - ]: 2701 : (void)node.GetLocalNonce();
70 [ + - ]: 2701 : const int ref_count = node.GetRefCount();
71 [ + - ]: 2701 : assert(ref_count >= 0);
72 [ + - ]: 2701 : (void)node.GetCommonVersion();
73 : :
74 : 2701 : const NetPermissionFlags net_permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
75 [ + - ]: 2701 : (void)node.HasPermission(net_permission_flags);
76 [ + - ]: 2701 : (void)node.ConnectedThroughNetwork();
77 : 2701 : }
78 : :
79 [ + - ]: 1697 : FUZZ_TARGET(local_address, .init = initialize_net)
80 : : {
81 : 1695 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
82 : 1695 : CService service{ConsumeService(fuzzed_data_provider)};
83 : 1695 : CNode node{ConsumeNode(fuzzed_data_provider)};
84 : : {
85 [ + - + - ]: 1695 : LOCK(g_maplocalhost_mutex);
86 : 1695 : mapLocalHost.clear();
87 : 1695 : }
88 [ + - + + : 469850 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
+ + ]
89 [ + - ]: 468155 : CallOneOf(
90 : : fuzzed_data_provider,
91 : 535183 : [&] {
92 : 67028 : service = ConsumeService(fuzzed_data_provider);
93 : 67028 : },
94 : 626730 : [&] {
95 : 158575 : const bool added{AddLocal(service, fuzzed_data_provider.ConsumeIntegralInRange<int>(0, LOCAL_MAX - 1))};
96 [ + + ]: 158575 : if (!added) return;
97 [ + - ]: 137454 : assert(service.IsRoutable());
98 [ + - ]: 137454 : assert(IsLocal(service));
99 [ + - ]: 137454 : assert(SeenLocal(service));
100 [ - + ]: 158575 : },
101 : 508594 : [&] {
102 : 40439 : (void)RemoveLocal(service);
103 : 40439 : },
104 : 510287 : [&] {
105 : 42132 : (void)SeenLocal(service);
106 : 42132 : },
107 : 485282 : [&] {
108 : 17127 : (void)IsLocal(service);
109 : 17127 : },
110 : 611009 : [&] {
111 : 142854 : (void)GetLocalAddress(node);
112 : 142854 : });
113 : 468155 : }
114 : 1695 : }
|