Skip to content

Commit 862fde8

Browse files
author
MarcoFalke
committed
Merge bitcoin#19067: tests: Add fuzzing harness for CNode
cc26fab tests: Add fuzzing harness for CNode (practicalswift) Pull request description: Add fuzzing harness for `CNode`. See [`doc/fuzzing.md`](https://github.com/bitcoin/bitcoin/blob/master/doc/fuzzing.md) for information on how to fuzz Bitcoin Core. Don't forget to contribute any coverage increasing inputs you find to the [Bitcoin Core fuzzing corpus repo](https://github.com/bitcoin-core/qa-assets). Happy fuzzing :) Top commit has no ACKs. Tree-SHA512: e6330e5de5b2eb44d3bd91a885e69ebb625bfd1cb2499338aeb3997ff0268848434e651126fe68a8cadd7235c391e61a40d6408ee26e457faf73572e0c375f6b
2 parents 15886b0 + cc26fab commit 862fde8

File tree

2 files changed

+163
-0
lines changed

2 files changed

+163
-0
lines changed

src/Makefile.test.include

+7
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ FUZZ_TARGETS = \
7070
test/fuzz/message \
7171
test/fuzz/messageheader_deserialize \
7272
test/fuzz/multiplication_overflow \
73+
test/fuzz/net \
7374
test/fuzz/net_permissions \
7475
test/fuzz/netaddr_deserialize \
7576
test/fuzz/netaddress \
@@ -722,6 +723,12 @@ test_fuzz_multiplication_overflow_LDADD = $(FUZZ_SUITE_LD_COMMON)
722723
test_fuzz_multiplication_overflow_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
723724
test_fuzz_multiplication_overflow_SOURCES = test/fuzz/multiplication_overflow.cpp
724725

726+
test_fuzz_net_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
727+
test_fuzz_net_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
728+
test_fuzz_net_LDADD = $(FUZZ_SUITE_LD_COMMON)
729+
test_fuzz_net_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
730+
test_fuzz_net_SOURCES = test/fuzz/net.cpp
731+
725732
test_fuzz_net_permissions_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
726733
test_fuzz_net_permissions_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
727734
test_fuzz_net_permissions_LDADD = $(FUZZ_SUITE_LD_COMMON)

src/test/fuzz/net.cpp

+156
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
// Copyright (c) 2020 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 <chainparamsbase.h>
7+
#include <net.h>
8+
#include <net_permissions.h>
9+
#include <netaddress.h>
10+
#include <optional.h>
11+
#include <protocol.h>
12+
#include <random.h>
13+
#include <test/fuzz/FuzzedDataProvider.h>
14+
#include <test/fuzz/fuzz.h>
15+
#include <test/fuzz/util.h>
16+
#include <test/util/setup_common.h>
17+
18+
#include <cstdint>
19+
#include <string>
20+
#include <vector>
21+
22+
void initialize()
23+
{
24+
static const BasicTestingSetup basic_testing_setup;
25+
}
26+
27+
void test_one_input(const std::vector<uint8_t>& buffer)
28+
{
29+
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
30+
31+
const std::optional<CAddress> address = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
32+
if (!address) {
33+
return;
34+
}
35+
const std::optional<CAddress> address_bind = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
36+
if (!address_bind) {
37+
return;
38+
}
39+
40+
CNode node{fuzzed_data_provider.ConsumeIntegral<NodeId>(),
41+
static_cast<ServiceFlags>(fuzzed_data_provider.ConsumeIntegral<uint64_t>()),
42+
fuzzed_data_provider.ConsumeIntegral<int>(),
43+
INVALID_SOCKET,
44+
*address,
45+
fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
46+
fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
47+
*address_bind,
48+
fuzzed_data_provider.ConsumeRandomLengthString(32),
49+
fuzzed_data_provider.PickValueInArray({ConnectionType::INBOUND, ConnectionType::OUTBOUND, ConnectionType::MANUAL, ConnectionType::FEELER, ConnectionType::BLOCK_RELAY, ConnectionType::ADDR_FETCH})};
50+
while (fuzzed_data_provider.ConsumeBool()) {
51+
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 12)) {
52+
case 0: {
53+
node.CloseSocketDisconnect();
54+
break;
55+
}
56+
case 1: {
57+
node.MaybeSetAddrName(fuzzed_data_provider.ConsumeRandomLengthString(32));
58+
break;
59+
}
60+
case 2: {
61+
node.SetSendVersion(fuzzed_data_provider.ConsumeIntegral<int>());
62+
break;
63+
}
64+
case 3: {
65+
const std::vector<bool> asmap = ConsumeRandomLengthIntegralVector<bool>(fuzzed_data_provider, 128);
66+
if (!SanityCheckASMap(asmap)) {
67+
break;
68+
}
69+
CNodeStats stats;
70+
node.copyStats(stats, asmap);
71+
break;
72+
}
73+
case 4: {
74+
node.SetRecvVersion(fuzzed_data_provider.ConsumeIntegral<int>());
75+
break;
76+
}
77+
case 5: {
78+
const CNode* add_ref_node = node.AddRef();
79+
assert(add_ref_node == &node);
80+
break;
81+
}
82+
case 6: {
83+
if (node.GetRefCount() > 0) {
84+
node.Release();
85+
}
86+
break;
87+
}
88+
case 7: {
89+
if (node.m_addr_known == nullptr) {
90+
break;
91+
}
92+
const std::optional<CAddress> addr_opt = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
93+
if (!addr_opt) {
94+
break;
95+
}
96+
node.AddAddressKnown(*addr_opt);
97+
break;
98+
}
99+
case 8: {
100+
if (node.m_addr_known == nullptr) {
101+
break;
102+
}
103+
const std::optional<CAddress> addr_opt = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
104+
if (!addr_opt) {
105+
break;
106+
}
107+
FastRandomContext fast_random_context{ConsumeUInt256(fuzzed_data_provider)};
108+
node.PushAddress(*addr_opt, fast_random_context);
109+
break;
110+
}
111+
case 9: {
112+
const std::optional<CInv> inv_opt = ConsumeDeserializable<CInv>(fuzzed_data_provider);
113+
if (!inv_opt) {
114+
break;
115+
}
116+
node.AddKnownTx(inv_opt->hash);
117+
break;
118+
}
119+
case 10: {
120+
node.PushTxInventory(ConsumeUInt256(fuzzed_data_provider));
121+
break;
122+
}
123+
case 11: {
124+
const std::optional<CService> service_opt = ConsumeDeserializable<CService>(fuzzed_data_provider);
125+
if (!service_opt) {
126+
break;
127+
}
128+
node.SetAddrLocal(*service_opt);
129+
break;
130+
}
131+
case 12: {
132+
const std::vector<uint8_t> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
133+
bool complete;
134+
node.ReceiveMsgBytes((const char*)b.data(), b.size(), complete);
135+
break;
136+
}
137+
}
138+
}
139+
140+
(void)node.GetAddrLocal();
141+
(void)node.GetAddrName();
142+
(void)node.GetId();
143+
(void)node.GetLocalNonce();
144+
(void)node.GetLocalServices();
145+
(void)node.GetMyStartingHeight();
146+
(void)node.GetRecvVersion();
147+
const int ref_count = node.GetRefCount();
148+
assert(ref_count >= 0);
149+
(void)node.GetSendVersion();
150+
(void)node.IsAddrRelayPeer();
151+
152+
const NetPermissionFlags net_permission_flags = fuzzed_data_provider.ConsumeBool() ?
153+
fuzzed_data_provider.PickValueInArray<NetPermissionFlags>({NetPermissionFlags::PF_NONE, NetPermissionFlags::PF_BLOOMFILTER, NetPermissionFlags::PF_RELAY, NetPermissionFlags::PF_FORCERELAY, NetPermissionFlags::PF_NOBAN, NetPermissionFlags::PF_MEMPOOL, NetPermissionFlags::PF_ISIMPLICIT, NetPermissionFlags::PF_ALL}) :
154+
static_cast<NetPermissionFlags>(fuzzed_data_provider.ConsumeIntegral<uint32_t>());
155+
(void)node.HasPermission(net_permission_flags);
156+
}

0 commit comments

Comments
 (0)