Skip to content

Commit fa1a14a

Browse files
author
MarcoFalke
committed
fuzz: Reset chainman state in process_message(s) targets
1 parent fa9a3de commit fa1a14a

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

src/test/fuzz/process_message.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,20 @@
3030
#include <vector>
3131

3232
namespace {
33-
const TestingSetup* g_setup;
33+
TestingSetup* g_setup;
3434
std::string_view LIMIT_TO_MESSAGE_TYPE{};
35+
36+
void ResetChainman(TestingSetup& setup)
37+
{
38+
SetMockTime(setup.m_node.chainman->GetParams().GenesisBlock().Time());
39+
setup.m_node.chainman.reset();
40+
setup.m_make_chainman();
41+
setup.LoadVerifyActivateChainstate();
42+
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
43+
MineBlock(setup.m_node, {});
44+
}
45+
setup.m_node.validation_signals->SyncWithValidationInterfaceQueue();
46+
}
3547
} // namespace
3648

3749
void initialize_process_message()
@@ -47,11 +59,7 @@ void initialize_process_message()
4759
{}),
4860
};
4961
g_setup = testing_setup.get();
50-
SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time()));
51-
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
52-
MineBlock(g_setup->m_node, {});
53-
}
54-
g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
62+
ResetChainman(*g_setup);
5563
}
5664

5765
FUZZ_TARGET(process_message, .init = initialize_process_message)
@@ -63,6 +71,7 @@ FUZZ_TARGET(process_message, .init = initialize_process_message)
6371
connman.ResetAddrCache();
6472
connman.ResetMaxOutboundCycle();
6573
auto& chainman = static_cast<TestChainstateManager&>(*g_setup->m_node.chainman);
74+
const auto block_index_size{WITH_LOCK(chainman.GetMutex(), return chainman.BlockIndex().size())};
6675
SetMockTime(1610000000); // any time to successfully reset ibd
6776
chainman.ResetIbd();
6877
chainman.DisableNextWrite();
@@ -111,4 +120,8 @@ FUZZ_TARGET(process_message, .init = initialize_process_message)
111120
}
112121
g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
113122
g_setup->m_node.connman->StopNodes();
123+
if (block_index_size != WITH_LOCK(chainman.GetMutex(), return chainman.BlockIndex().size())) {
124+
// Reuse the global chainman, but reset it when it is dirty
125+
ResetChainman(*g_setup);
126+
}
114127
}

src/test/fuzz/process_messages.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,19 @@
2626
#include <vector>
2727

2828
namespace {
29-
const TestingSetup* g_setup;
29+
TestingSetup* g_setup;
30+
31+
void ResetChainman(TestingSetup& setup)
32+
{
33+
SetMockTime(setup.m_node.chainman->GetParams().GenesisBlock().Time());
34+
setup.m_node.chainman.reset();
35+
setup.m_make_chainman();
36+
setup.LoadVerifyActivateChainstate();
37+
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
38+
MineBlock(setup.m_node, {});
39+
}
40+
setup.m_node.validation_signals->SyncWithValidationInterfaceQueue();
41+
}
3042
} // namespace
3143

3244
void initialize_process_messages()
@@ -37,11 +49,7 @@ void initialize_process_messages()
3749
{}),
3850
};
3951
g_setup = testing_setup.get();
40-
SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time()));
41-
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
42-
MineBlock(g_setup->m_node, {});
43-
}
44-
g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
52+
ResetChainman(*g_setup);
4553
}
4654

4755
FUZZ_TARGET(process_messages, .init = initialize_process_messages)
@@ -53,6 +61,7 @@ FUZZ_TARGET(process_messages, .init = initialize_process_messages)
5361
connman.ResetAddrCache();
5462
connman.ResetMaxOutboundCycle();
5563
auto& chainman = static_cast<TestChainstateManager&>(*g_setup->m_node.chainman);
64+
const auto block_index_size{WITH_LOCK(chainman.GetMutex(), return chainman.BlockIndex().size())};
5665
SetMockTime(1610000000); // any time to successfully reset ibd
5766
chainman.ResetIbd();
5867
chainman.DisableNextWrite();
@@ -111,4 +120,8 @@ FUZZ_TARGET(process_messages, .init = initialize_process_messages)
111120
}
112121
g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
113122
g_setup->m_node.connman->StopNodes();
123+
if (block_index_size != WITH_LOCK(chainman.GetMutex(), return chainman.BlockIndex().size())) {
124+
// Reuse the global chainman, but reset it when it is dirty
125+
ResetChainman(*g_setup);
126+
}
114127
}

0 commit comments

Comments
 (0)