gui: crash fix, disconnect numBlocksChanged() signal during shutdown

The crash stems from the order of the shutdown procedure:
We first unset the client model, then destroy the wallet controller—but we leave
the internal wallet models ('m_wallets') untouched for a brief period. As a result,
there’s a point in time where views still have connected signals and access to
wallet models that are not connected to any wallet controller.
Now.. since the clientModel is only replaced with nullptr locally and not destroyed
yet, signals like numBlocksChanged can still emit. Thus, when wallet views receive
them, they see a non-null wallet model ptr, and proceed to call backend functions
from a model that is being torn down.

As the shutdown procedure begins by unsetting clientModel from all views. It’s safe
to ignore events when clientModel is nullptr.
This commit is contained in:
furszy 2025-04-07 11:38:48 -04:00
parent 0dc74c92c0
commit 71656bdfaa
No known key found for this signature in database
GPG Key ID: 5DD23CCC686AA623

View File

@ -855,6 +855,10 @@ void SendCoinsDialog::updateCoinControlState()
}
void SendCoinsDialog::updateNumberOfBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, SyncType synctype, SynchronizationState sync_state) {
// During shutdown, clientModel will be nullptr. Attempting to update views at this point may cause a crash
// due to accessing backend models that might no longer exist.
if (!clientModel) return;
// Process event
if (sync_state == SynchronizationState::POST_INIT) {
updateSmartFeeLabel();
}