Skip to content

Commit fa8dd34

Browse files
author
MarcoFalke
committed
Merge #20332: test: Mock IBD in net_processing fuzzers
fa4234d test: Mock IBD in net_processing fuzzers (MarcoFalke) Pull request description: Without this the fuzzers fail to detect trivial crasher bugs, such as bitcoin/bitcoin#20317 (comment) ACKs for top commit: practicalswift: Tested ACK fa4234d Tree-SHA512: ce5da5c0a604b7559805a98ffdde882b44ca4f91b003b493d6e1be230714ce4cccb11dbfc1fc175f9d8fc779551c0a4103ceb4b473552928207d7d78ae329e10
2 parents 42f950c + fa4234d commit fa8dd34

File tree

6 files changed

+56
-4
lines changed

6 files changed

+56
-4
lines changed

src/Makefile.test_util.include

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ TEST_UTIL_H = \
1515
test/util/setup_common.h \
1616
test/util/str.h \
1717
test/util/transaction_utils.h \
18+
test/util/validation.h \
1819
test/util/wallet.h
1920

2021
libtest_util_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(MINIUPNPC_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS)
@@ -27,6 +28,7 @@ libtest_util_a_SOURCES = \
2728
test/util/setup_common.cpp \
2829
test/util/str.cpp \
2930
test/util/transaction_utils.cpp \
31+
test/util/validation.cpp \
3032
test/util/wallet.cpp \
3133
$(TEST_UTIL_H)
3234

src/test/fuzz/process_message.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <test/util/mining.h>
1717
#include <test/util/net.h>
1818
#include <test/util/setup_common.h>
19+
#include <test/util/validation.h>
1920
#include <util/memory.h>
2021
#include <validationinterface.h>
2122
#include <version.h>
@@ -63,10 +64,14 @@ void test_one_input(const std::vector<uint8_t>& buffer)
6364
{
6465
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
6566
ConnmanTestMsg& connman = *(ConnmanTestMsg*)g_setup->m_node.connman.get();
67+
TestChainState& chainstate = *(TestChainState*)&g_setup->m_node.chainman->ActiveChainstate();
68+
chainstate.ResetIbd();
6669
const std::string random_message_type{fuzzed_data_provider.ConsumeBytesAsString(CMessageHeader::COMMAND_SIZE).c_str()};
6770
if (!LIMIT_TO_MESSAGE_TYPE.empty() && random_message_type != LIMIT_TO_MESSAGE_TYPE) {
6871
return;
6972
}
73+
const bool jump_out_of_ibd{fuzzed_data_provider.ConsumeBool()};
74+
if (jump_out_of_ibd) chainstate.JumpOutOfIbd();
7075
CDataStream random_bytes_data_stream{fuzzed_data_provider.ConsumeRemainingBytes<unsigned char>(), SER_NETWORK, PROTOCOL_VERSION};
7176
CNode& p2p_node = *MakeUnique<CNode>(0, ServiceFlags(NODE_NETWORK | NODE_WITNESS | NODE_BLOOM), 0, INVALID_SOCKET, CAddress{CService{in_addr{0x0100007f}, 7777}, NODE_NETWORK}, 0, 0, CAddress{}, std::string{}, ConnectionType::OUTBOUND_FULL_RELAY).release();
7277
p2p_node.fSuccessfullyConnected = true;
@@ -76,7 +81,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
7681
g_setup->m_node.peerman->InitializeNode(&p2p_node);
7782
try {
7883
g_setup->m_node.peerman->ProcessMessage(p2p_node, random_message_type, random_bytes_data_stream,
79-
GetTime<std::chrono::microseconds>(), std::atomic<bool>{false});
84+
GetTime<std::chrono::microseconds>(), std::atomic<bool>{false});
8085
} catch (const std::ios_base::failure&) {
8186
}
8287
SyncWithValidationInterfaceQueue();

src/test/fuzz/process_messages.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <test/util/mining.h>
1313
#include <test/util/net.h>
1414
#include <test/util/setup_common.h>
15+
#include <test/util/validation.h>
1516
#include <util/memory.h>
1617
#include <validation.h>
1718
#include <validationinterface.h>
@@ -39,7 +40,10 @@ void test_one_input(const std::vector<uint8_t>& buffer)
3940
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
4041

4142
ConnmanTestMsg& connman = *(ConnmanTestMsg*)g_setup->m_node.connman.get();
43+
TestChainState& chainstate = *(TestChainState*)&g_setup->m_node.chainman->ActiveChainstate();
44+
chainstate.ResetIbd();
4245
std::vector<CNode*> peers;
46+
bool jump_out_of_ibd{false};
4347

4448
const auto num_peers_to_add = fuzzed_data_provider.ConsumeIntegralInRange(1, 3);
4549
for (int i = 0; i < num_peers_to_add; ++i) {
@@ -58,6 +62,8 @@ void test_one_input(const std::vector<uint8_t>& buffer)
5862
}
5963

6064
while (fuzzed_data_provider.ConsumeBool()) {
65+
if (!jump_out_of_ibd) jump_out_of_ibd = fuzzed_data_provider.ConsumeBool();
66+
if (jump_out_of_ibd && chainstate.IsInitialBlockDownload()) chainstate.JumpOutOfIbd();
6167
const std::string random_message_type{fuzzed_data_provider.ConsumeBytesAsString(CMessageHeader::COMMAND_SIZE).c_str()};
6268

6369
CSerializedNetMsg net_msg;

src/test/util/validation.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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 <test/util/validation.h>
6+
7+
#include <util/check.h>
8+
#include <util/time.h>
9+
#include <validation.h>
10+
11+
void TestChainState::ResetIbd()
12+
{
13+
m_cached_finished_ibd = false;
14+
assert(IsInitialBlockDownload());
15+
}
16+
17+
void TestChainState::JumpOutOfIbd()
18+
{
19+
Assert(IsInitialBlockDownload());
20+
m_cached_finished_ibd = true;
21+
Assert(!IsInitialBlockDownload());
22+
}

src/test/util/validation.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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+
#ifndef BITCOIN_TEST_UTIL_VALIDATION_H
6+
#define BITCOIN_TEST_UTIL_VALIDATION_H
7+
8+
#include <validation.h>
9+
10+
struct TestChainState : public CChainState {
11+
/** Reset the ibd cache to its initial state */
12+
void ResetIbd();
13+
/** Toggle IsInitialBlockDownload from true to false */
14+
void JumpOutOfIbd();
15+
};
16+
17+
#endif // BITCOIN_TEST_UTIL_VALIDATION_H

src/validation.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,9 +503,9 @@ enum class CoinsCacheSizeState
503503
* whereas block information and metadata independent of the current tip is
504504
* kept in `BlockMetadataManager`.
505505
*/
506-
class CChainState {
507-
private:
508-
506+
class CChainState
507+
{
508+
protected:
509509
/**
510510
* Every received block is assigned a unique and increasing identifier, so we
511511
* know which one to give priority in case of a fork.

0 commit comments

Comments
 (0)