elements/src
Hennadii Stepanov ff26406b2b
Merge bitcoin-core/gui#693: Fix segfault when shutdown during wallet open
9a1d73fdff Fix segfault when shutdown during wallet open (John Moffett)

Pull request description:

  Fixes #689

  ## Summary

  If you open a wallet and send a shutdown signal during that process, you'll get a segfault when the wallet finishes opening. That's because the `WalletController` object gets deleted manually in bitcoin.cpp during shutdown, but copies of the pointer (and pointers to child objects) are dangling in various places and are accessed in queued events after the deletion.

  ## Details

  The issue in #689 is caused by the following sequence of events:

  1. Wallet open modal dialog is shown and worker thread does the actual work.
  2. Every 200ms, the main event loop checks to see if a shutdown has been requested, but only if a modal is not being shown.
  3. Request a shutdown while the modal window is shown.
  4. The wallet open process completes, the modal window is dismissed, and various `finish` signals are sent.
  5. During handling of one of the `finish` signals, `qApp->processEvents()` is [called](e9262ea32a/src/qt/sendcoinsdialog.cpp (L603)), which causes the main event loop to detect the shutdown (now that the modal window has been dismissed). The `WalletController` and all the `WalletModel`s are [deleted](65de8eeeca/src/qt/bitcoin.cpp (L394-L401)).
  6. Control returns to the `finish` method, which eventually tries to send a [signal](e9262ea32a/src/qt/sendcoinsdialog.cpp (L167)) from a wallet model, but it's been deleted already (and the signal is sent from a now-[dangling](d8bdee0fc8/src/qt/walletview.cpp (L65)) pointer).

  The simplest fix for that is to change the `qApp->processEvents()` into a `QueuedConnection` call. (The `qApp->processEvents() was a [workaround](https://github.com/bitcoin/bitcoin/pull/593#issuecomment-3050699) to get the GUI to scroll to the last item in a list that just got added, and this is just a safer way of doing that).

  However, once that segfault is fixed, another segfault occurs due to some queued wallet events happening after the wallet controller object is deleted here:

  65de8eeeca/src/qt/bitcoin.cpp (L394-L401)

  Since `m_wallet_controller` is a copy of that pointer in `bitcoingui.cpp`, it's now dangling and `if(null)` checks won't work correctly. For instance, this line:

  65de8eeeca/src/qt/bitcoingui.cpp (L413)

  sets up a `QueuedConnection` to `setCurrentWallet`, but by the time control reaches that method (one event cycle after shutdown deleted `m_wallet_controller` in `bitcoin.cpp`), the underlying objects have been destroyed (but the pointers are still dangling).

  Ideally, we'd use a `QPointer` or `std::shared_ptr / std::weak_ptr`s for these, but the changes would be more involved.

  This is a minimal fix for the issues. Just set `m_wallet_controller` to `nullptr` in `bitcoingui.cpp`, check its value in a couple places, and avoid a use of `qApp->processEvents`.

ACKs for top commit:
  hebasto:
    ACK 9a1d73fdff, I have reviewed the code and it looks OK.
  furszy:
    ACK 9a1d73fdff

Tree-SHA512: a1b94676eb2fcb7606e68fab443b1565b4122aab93c35382b561842a049f4b43fecc459535370d67a64d6ebc4bcec0ebcda981fff633ebd41bdba6f7093ea540
2023-03-27 15:53:42 +01:00
..
bench Merge bitcoin/bitcoin#26642: clang-tidy: Add more performance-* checks and related fixes 2023-03-27 14:34:52 +01:00
common Deduplicate bitcoind and bitcoin-qt init code 2023-02-28 12:04:47 -05:00
compat compat: use STDIN_FILENO over 0 2023-01-04 12:00:25 +00:00
config
consensus Merge bitcoin/bitcoin#26345: refactor: modernize the implementation of uint256.* 2023-02-06 13:56:51 -05:00
crc32c Update crc32c subtree to latest upstream master 2022-08-13 13:55:38 +01:00
crypto Merge bitcoin/bitcoin#26153: Reduce wasted pseudorandom bytes in ChaCha20 + various improvements 2023-02-15 14:58:47 +00:00
index Refactor: Remove unused FlatFilePos::SetNull 2023-03-21 13:54:11 +01:00
init Merge bitcoin/bitcoin#26957: bench: update logging benchmarks 2023-03-23 17:03:39 -04:00
interfaces Remove reindex special case from the progress bar label 2023-02-07 11:02:01 +01:00
ipc scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
kernel Merge bitcoin/bitcoin#26177: refactor / kernel: Move non-gArgs chainparams functionality to kernel 2023-03-16 13:56:35 +00:00
leveldb Update leveldb-subtree subtree to latest upstream 2022-09-29 16:43:30 +01:00
logging Use steady clock for logging timer 2023-01-31 18:48:50 +01:00
minisketch Update minisketch subtree to latest upstream 2022-10-23 15:03:04 +01:00
node clang-tidy: Add performance-inefficient-vector-operation check 2023-03-26 20:17:55 +01:00
policy clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
primitives scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
qt Merge bitcoin-core/gui#693: Fix segfault when shutdown during wallet open 2023-03-27 15:53:42 +01:00
rpc clang-tidy: Add performance-inefficient-vector-operation check 2023-03-26 20:17:55 +01:00
script clang-tidy: Add performance-inefficient-vector-operation check 2023-03-26 20:17:55 +01:00
secp256k1 Update src/secp256k1 subtree to upstream libsecp256k1 v0.3.0 2023-03-08 17:41:24 -05:00
support util: Remove duplicate include 2023-02-23 17:58:40 -05:00
test Merge bitcoin/bitcoin#26642: clang-tidy: Add more performance-* checks and related fixes 2023-03-27 14:34:52 +01:00
univalue Merge bitcoin/bitcoin#26612: refactor: RPC: pass named argument value as string_view 2023-03-03 15:23:43 +01:00
util clang-tidy: Add performance-faster-string-find check 2023-03-26 20:17:46 +01:00
wallet Merge bitcoin/bitcoin#26642: clang-tidy: Add more performance-* checks and related fixes 2023-03-27 14:34:52 +01:00
zmq clang-tidy: Add performance-faster-string-find check 2023-03-26 20:17:46 +01:00
.bear-tidy-config
.clang-format
.clang-tidy clang-tidy: Exclude performance-* checks rather including them 2023-03-26 20:18:13 +01:00
addrdb.cpp refactor: Move error() from util/system.h to logging.h 2023-03-13 17:09:54 +01:00
addrdb.h
addrman.cpp Merge bitcoin/bitcoin#25619: net: avoid overriding non-virtual ToString() in CService and use better naming 2023-02-17 13:34:40 -05:00
addrman.h addrman: Use std::nullopt instead of {} 2023-02-01 10:18:08 -05:00
addrman_impl.h addrman, refactor: combine two size functions 2023-01-26 18:11:13 -05:00
arith_uint256.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
arith_uint256.h Fix clang-tidy readability-const-return-type violations 2023-02-01 11:33:35 +01:00
attributes.h
banman.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
banman.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
base58.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
base58.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
bech32.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
bech32.h
bitcoin-chainstate.cpp Merge bitcoin/bitcoin#26177: refactor / kernel: Move non-gArgs chainparams functionality to kernel 2023-03-16 13:56:35 +00:00
bitcoin-cli-res.rc
bitcoin-cli.cpp clang-tidy: Add performance-inefficient-vector-operation check 2023-03-26 20:17:55 +01:00
bitcoin-tx-res.rc
bitcoin-tx.cpp refactor: Extract util/exception from util/system 2023-03-13 17:09:47 +01:00
bitcoin-util-res.rc
bitcoin-util.cpp clang-tidy: Add performance-inefficient-vector-operation check 2023-03-26 20:17:55 +01:00
bitcoin-wallet-res.rc
bitcoin-wallet.cpp refactor: Extract util/exception from util/system 2023-03-13 17:09:47 +01:00
bitcoind-res.rc
bitcoind.cpp refactor: Extract util/exception from util/system 2023-03-13 17:09:47 +01:00
blockencodings.cpp Use DataStream where possible 2023-01-26 10:44:05 +01:00
blockencodings.h script: remove out-of-date snprintf TODO 2023-02-15 14:42:28 -08:00
blockfilter.cpp refactor: use Hash helper for double-SHA256 calculations 2023-01-31 19:34:35 +01:00
blockfilter.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
chain.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
chain.h refactor: add kernel/cs_main.* 2023-01-05 09:05:14 +00:00
chainparams.cpp Split non/kernel chainparams 2023-03-15 16:43:31 +01:00
chainparams.h Split non/kernel chainparams 2023-03-15 16:43:31 +01:00
chainparamsbase.cpp
chainparamsbase.h
chainparamsseeds.h Merge bitcoin/bitcoin#25853: net: update testnet torv3 hardcoded seeds for 24.x 2022-09-09 10:07:39 +02:00
checkqueue.h refactor: Use move semantics in CCheckQueue::Loop 2023-03-21 13:04:21 +00:00
clientversion.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
clientversion.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
coins.cpp Add deterministic mode to CCoinsViewCache 2023-02-02 09:00:15 -05:00
coins.h Add deterministic mode to CCoinsViewCache 2023-02-02 09:00:15 -05:00
compressor.cpp
compressor.h
core_io.h rpc: decode Miniscript descriptor when possible in decodescript 2023-02-03 18:15:42 +01:00
core_memusage.h
core_read.cpp Use DataStream where possible 2023-01-26 10:44:05 +01:00
core_write.cpp rpc: decode Miniscript descriptor when possible in decodescript 2023-02-03 18:15:42 +01:00
cuckoocache.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
dbwrapper.cpp refactor, dbwrapper: Add DBParams and DBOptions structs 2023-02-10 04:39:11 -04:00
dbwrapper.h refactor, dbwrapper: Add DBParams and DBOptions structs 2023-02-10 04:39:11 -04:00
deploymentinfo.cpp Decouple RegTestChainParams from ArgsManager 2023-03-15 16:42:42 +01:00
deploymentinfo.h Decouple RegTestChainParams from ArgsManager 2023-03-15 16:42:42 +01:00
deploymentstatus.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
deploymentstatus.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
dummywallet.cpp
external_signer.cpp Fix clang-tidy readability-const-return-type violations 2023-02-01 11:33:35 +01:00
external_signer.h Fix clang-tidy readability-const-return-type violations 2023-02-01 11:33:35 +01:00
flatfile.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
flatfile.h Refactor: Remove unused FlatFilePos::SetNull 2023-03-21 13:54:11 +01:00
fs.cpp Merge bitcoin/bitcoin#25898: util: remove WSL 1 workaround in fs 2023-02-16 12:33:26 +00:00
fs.h clang-tidy: Fix performance-move-const-arg in headers 2023-01-18 15:47:06 +00:00
hash.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
hash.h Merge bitcoin/bitcoin#26649: refactor: Use AutoFile and HashVerifier (without ser-type and ser-version) where possible 2023-01-30 15:57:12 +00:00
headerssync.cpp Move headerssync logging to BCLog::NET 2022-08-30 12:09:04 -04:00
headerssync.h Track headers presync progress and log it 2022-08-29 08:10:35 -04:00
httprpc.cpp Merge bitcoin/bitcoin#25619: net: avoid overriding non-virtual ToString() in CService and use better naming 2023-02-17 13:34:40 -05:00
httprpc.h
httpserver.cpp Merge bitcoin/bitcoin#26742: http: Track active requests and wait for last to finish - 2nd attempt 2023-03-06 19:35:59 -05:00
httpserver.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
i2p.cpp Merge bitcoin/bitcoin#26837: I2P network optimizations 2023-02-22 17:58:41 +00:00
i2p.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
indirectmap.h
init.cpp Merge bitcoin/bitcoin#26899: p2p: set -dnsseed and -listen false if maxconnections=0 2023-03-20 12:49:10 -04:00
init.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
key.cpp refactor: use Hash helper for double-SHA256 calculations 2023-01-31 19:34:35 +01:00
key.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
key_io.cpp Improve address decoding errors 2023-01-17 18:31:51 +01:00
key_io.h
logging.cpp refactor: Replace GetTimeMicros by SystemClock 2023-03-09 15:05:11 +01:00
logging.h refactor: Move error() from util/system.h to logging.h 2023-03-13 17:09:54 +01:00
Makefile.am Merge bitcoin/bitcoin#26177: refactor / kernel: Move non-gArgs chainparams functionality to kernel 2023-03-16 13:56:35 +00:00
Makefile.bench.include Merge bitcoin/bitcoin#16981: Improve runtime performance of --reindex 2022-11-15 19:23:39 -05:00
Makefile.crc32c.include
Makefile.leveldb.include Use more specific path when including memenv.h header 2022-06-23 15:33:01 +02:00
Makefile.minisketch.include build: Build minisketch test in make check, not in make 2022-07-21 10:42:09 +01:00
Makefile.qt.include build: extract $(BOOST_CPPFLAGS) from $(BITCOIN_INCLUDES) 2022-09-13 17:15:17 +01:00
Makefile.qt_locale.include qt: Periodic translation updates from Transifex 2023-02-27 13:53:29 +00:00
Makefile.qttest.include build: extract $(BOOST_CPPFLAGS) from $(BITCOIN_INCLUDES) 2022-09-13 17:15:17 +01:00
Makefile.test.include Merge bitcoin/bitcoin#27150: Deduplicate bitcoind and bitcoin-qt init code 2023-03-07 13:05:01 -05:00
Makefile.test_fuzz.include [fuzz] Move ConsumeNetAddr to fuzz/util/net.h 2022-11-17 14:52:45 +00:00
Makefile.test_util.include Merge bitcoin/bitcoin#26940: test: create random and coins utils, add amount helper, dedupe add_coin 2023-02-17 17:28:14 -05:00
Makefile.univalue.include
mapport.cpp Merge bitcoin/bitcoin#25619: net: avoid overriding non-virtual ToString() in CService and use better naming 2023-02-17 13:34:40 -05:00
mapport.h Remove configure-time setting of DEFAULT_UPNP 2023-01-28 15:24:13 +00:00
memusage.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
merkleblock.cpp
merkleblock.h
net.cpp [net] Add CNode helper for send byte accounting 2023-03-22 13:18:57 +01:00
net.h [net] Remove CNode friends 2023-03-22 13:18:57 +01:00
net_permissions.cpp
net_permissions.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
net_processing.cpp Merge bitcoin/bitcoin#27257: refactor, net: End friendship of CNode, CConnman and ConnmanTestMsg 2023-03-23 17:31:52 +00:00
net_processing.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
net_types.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
net_types.h
netaddress.cpp Merge bitcoin/bitcoin#25619: net: avoid overriding non-virtual ToString() in CService and use better naming 2023-02-17 13:34:40 -05:00
netaddress.h Merge bitcoin/bitcoin#25619: net: avoid overriding non-virtual ToString() in CService and use better naming 2023-02-17 13:34:40 -05:00
netbase.cpp refactor: Move error() from util/system.h to logging.h 2023-03-13 17:09:54 +01:00
netbase.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
netgroup.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
netgroup.h
netmessagemaker.h
noui.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
noui.h
outputtype.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
outputtype.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
pow.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
pow.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
prevector.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
protocol.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
protocol.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
psbt.cpp Merge bitcoin/bitcoin#24149: Signing support for Miniscript Descriptors 2023-02-16 10:01:33 +00:00
psbt.h Merge bitcoin/bitcoin#26997: psbt: s/transcation/transaction/ 2023-02-16 09:39:50 +00:00
pubkey.cpp Merge bitcoin/bitcoin#26691: Update secp256k1 subtree to libsecp256k1 version 0.2.0 2023-01-13 09:40:57 +00:00
pubkey.h Merge bitcoin/bitcoin#26691: Update secp256k1 subtree to libsecp256k1 version 0.2.0 2023-01-13 09:40:57 +00:00
random.cpp Use steady clock in SeedStrengthen and FindBestImplementation 2023-03-02 14:48:28 +01:00
random.h Merge bitcoin/bitcoin#26153: Reduce wasted pseudorandom bytes in ChaCha20 + various improvements 2023-02-15 14:58:47 +00:00
randomenv.cpp Merge bitcoin/bitcoin#26826: refactor: remove windows-only compat.h usage in randomenv 2023-01-23 16:36:27 +01:00
randomenv.h
rest.cpp Merge bitcoin/bitcoin#26207: rest: add verbose and mempool_sequence query params for mempool/contents 2023-03-15 19:39:30 -04:00
rest.h
reverse_iterator.h doc: remove usages of C++11 2023-01-12 13:42:44 +00:00
scheduler.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
scheduler.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
serialize.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
shutdown.cpp Add InitError(error, details) overload 2023-02-28 12:04:47 -05:00
shutdown.h
signet.cpp
signet.h
span.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
streams.h Merge bitcoin/bitcoin#26992: refactor: Remove unused CDataStream SerializeMany constructor 2023-02-02 10:47:37 +00:00
sync.cpp
sync.h doc: Export threadsafety.h from sync.h 2023-01-25 09:33:26 +01:00
threadsafety.h
timedata.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
timedata.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
tinyformat.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
torcontrol.cpp Merge bitcoin/bitcoin#25619: net: avoid overriding non-virtual ToString() in CService and use better naming 2023-02-17 13:34:40 -05:00
torcontrol.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
txdb.cpp refactor: Move error() from util/system.h to logging.h 2023-03-13 17:09:54 +01:00
txdb.h refactor, txdb: Use DBParams struct in CBlockTreeDB 2023-02-10 04:39:11 -04:00
txmempool.cpp Merge bitcoin/bitcoin#26531: mempool: Add mempool tracepoints 2023-03-20 12:42:24 -04:00
txmempool.h Fix clang-tidy readability-const-return-type violations 2023-02-01 11:33:35 +01:00
txorphanage.cpp Merge bitcoin/bitcoin#26551: p2p: Track orphans by who provided them 2023-01-26 10:36:18 +00:00
txorphanage.h Merge bitcoin/bitcoin#26551: p2p: Track orphans by who provided them 2023-01-26 10:36:18 +00:00
txrequest.cpp
txrequest.h
uint256.cpp refactor: modernize the implementation of uint256.* 2022-12-10 14:34:44 -06:00
uint256.h Merge bitcoin/bitcoin#26345: refactor: modernize the implementation of uint256.* 2023-02-06 13:56:51 -05:00
undo.h
validation.cpp Merge bitcoin/bitcoin#26749: refactor: Use move semantics instead of custom swap functions 2023-03-22 11:16:56 +00:00
validation.h refactor: Drop no longer used swap member functions 2023-03-21 13:04:53 +00:00
validationinterface.cpp Fix clang-tidy readability-const-return-type violations 2023-02-01 11:33:35 +01:00
validationinterface.h refactor: add kernel/cs_main.* 2023-01-05 09:05:14 +00:00
version.h
versionbits.cpp refactor: use braced init for integer constants instead of c style casts 2023-01-03 19:31:29 -06:00
versionbits.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
walletinitinterface.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
warnings.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
warnings.h