From fa1a14a13a15ecfb7587a94ee86b4ace7c819519 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Tue, 1 Jul 2025 16:53:44 +0200 Subject: [PATCH] fuzz: Reset chainman state in process_message(s) targets --- src/test/fuzz/process_message.cpp | 25 +++++++++++++++++++------ src/test/fuzz/process_messages.cpp | 25 +++++++++++++++++++------ 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/test/fuzz/process_message.cpp b/src/test/fuzz/process_message.cpp index 202e3e4bfa9..809831a6efe 100644 --- a/src/test/fuzz/process_message.cpp +++ b/src/test/fuzz/process_message.cpp @@ -30,8 +30,20 @@ #include namespace { -const TestingSetup* g_setup; +TestingSetup* g_setup; std::string_view LIMIT_TO_MESSAGE_TYPE{}; + +void ResetChainman(TestingSetup& setup) +{ + SetMockTime(setup.m_node.chainman->GetParams().GenesisBlock().Time()); + setup.m_node.chainman.reset(); + setup.m_make_chainman(); + setup.LoadVerifyActivateChainstate(); + for (int i = 0; i < 2 * COINBASE_MATURITY; i++) { + MineBlock(setup.m_node, {}); + } + setup.m_node.validation_signals->SyncWithValidationInterfaceQueue(); +} } // namespace void initialize_process_message() @@ -47,11 +59,7 @@ void initialize_process_message() {}), }; g_setup = testing_setup.get(); - SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time())); - for (int i = 0; i < 2 * COINBASE_MATURITY; i++) { - MineBlock(g_setup->m_node, {}); - } - g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue(); + ResetChainman(*g_setup); } FUZZ_TARGET(process_message, .init = initialize_process_message) @@ -63,6 +71,7 @@ FUZZ_TARGET(process_message, .init = initialize_process_message) connman.ResetAddrCache(); connman.ResetMaxOutboundCycle(); auto& chainman = static_cast(*g_setup->m_node.chainman); + const auto block_index_size{WITH_LOCK(chainman.GetMutex(), return chainman.BlockIndex().size())}; SetMockTime(1610000000); // any time to successfully reset ibd chainman.ResetIbd(); chainman.DisableNextWrite(); @@ -111,4 +120,8 @@ FUZZ_TARGET(process_message, .init = initialize_process_message) } g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue(); g_setup->m_node.connman->StopNodes(); + if (block_index_size != WITH_LOCK(chainman.GetMutex(), return chainman.BlockIndex().size())) { + // Reuse the global chainman, but reset it when it is dirty + ResetChainman(*g_setup); + } } diff --git a/src/test/fuzz/process_messages.cpp b/src/test/fuzz/process_messages.cpp index 6df261cb595..baaeffe3dbf 100644 --- a/src/test/fuzz/process_messages.cpp +++ b/src/test/fuzz/process_messages.cpp @@ -26,7 +26,19 @@ #include namespace { -const TestingSetup* g_setup; +TestingSetup* g_setup; + +void ResetChainman(TestingSetup& setup) +{ + SetMockTime(setup.m_node.chainman->GetParams().GenesisBlock().Time()); + setup.m_node.chainman.reset(); + setup.m_make_chainman(); + setup.LoadVerifyActivateChainstate(); + for (int i = 0; i < 2 * COINBASE_MATURITY; i++) { + MineBlock(setup.m_node, {}); + } + setup.m_node.validation_signals->SyncWithValidationInterfaceQueue(); +} } // namespace void initialize_process_messages() @@ -37,11 +49,7 @@ void initialize_process_messages() {}), }; g_setup = testing_setup.get(); - SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time())); - for (int i = 0; i < 2 * COINBASE_MATURITY; i++) { - MineBlock(g_setup->m_node, {}); - } - g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue(); + ResetChainman(*g_setup); } FUZZ_TARGET(process_messages, .init = initialize_process_messages) @@ -53,6 +61,7 @@ FUZZ_TARGET(process_messages, .init = initialize_process_messages) connman.ResetAddrCache(); connman.ResetMaxOutboundCycle(); auto& chainman = static_cast(*g_setup->m_node.chainman); + const auto block_index_size{WITH_LOCK(chainman.GetMutex(), return chainman.BlockIndex().size())}; SetMockTime(1610000000); // any time to successfully reset ibd chainman.ResetIbd(); chainman.DisableNextWrite(); @@ -111,4 +120,8 @@ FUZZ_TARGET(process_messages, .init = initialize_process_messages) } g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue(); g_setup->m_node.connman->StopNodes(); + if (block_index_size != WITH_LOCK(chainman.GetMutex(), return chainman.BlockIndex().size())) { + // Reuse the global chainman, but reset it when it is dirty + ResetChainman(*g_setup); + } }