From 59876a4873b57888f7c8e80775fc8057e1b308a6 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Tue, 28 Nov 2017 12:08:09 +0100 Subject: [PATCH] Fix shutdown in case of errors during initialization PR #10286 introduced a few steps which are not robust to early shutdown in initialization. Stumbled upon this with #11781, not sure if there are other scenarios that can trigger it, but it's harden against this in any case. --- src/init.cpp | 5 ++++- src/validationinterface.cpp | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 3e59bd952fd4bd..904e8e1437e7e5 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -232,7 +232,10 @@ void PrepareShutdown() #endif StopMapPort(); - UnregisterValidationInterface(peerLogic.get()); + // Because these depend on each-other, we make sure that neither can be + // using the other before destroying them. + if (peerLogic) UnregisterValidationInterface(peerLogic.get()); + if (g_connman) g_connman->Stop(); peerLogic.reset(); g_connman.reset(); diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp index 30fcb04265ec26..bf59ed00806131 100644 --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -57,7 +57,9 @@ void CMainSignals::UnregisterBackgroundSignalScheduler() { } void CMainSignals::FlushBackgroundCallbacks() { - m_internals->m_schedulerClient.EmptyQueue(); + if (m_internals) { + m_internals->m_schedulerClient.EmptyQueue(); + } } CMainSignals& GetMainSignals() @@ -93,6 +95,9 @@ void UnregisterValidationInterface(CValidationInterface* pwalletIn) void UnregisterAllValidationInterfaces() { + if (!g_signals.m_internals) { + return; + } g_signals.m_internals->BlockFound.disconnect_all_slots(); g_signals.m_internals->BlockChecked.disconnect_all_slots(); g_signals.m_internals->Broadcast.disconnect_all_slots();