elements/src/wallet
Sebastian Falbesoner ff712274d9 wallet: fix segfault by avoiding invalid default-ctored external_spk_managers entry
In the method `CWallet::LoadActiveScriptPubKeyMan`, the map
`external_spk_managers` (or `internal_spk_managers`, if parameter
`internal` is false) is accessed via std::map::operator[], which means
that a default-ctored entry is created with a null-pointer as value, if
the key doesn't exist.  As soon as this value is dereferenced, a
segmentation fault occurs, e.g. in `CWallet::KeypoolCountExternalKeys`.

The bevaviour can be reproduced by the following steps (starting with empty regtest datadir):

$ ./src/bitcoind -regtest -daemon
$ ./src/bitcoin-cli -regtest -named createwallet_name=wallet descriptors=true blank=true
$ cat regtest-descriptors.txt
[
  {
    "desc": "tr([e4445899/49'/1'/0']tprv8ZgxMBicQKsPd8jCeBWsYLEoWxbVgzJDatJ7XkwQ6G3uF4FsHuaziHQ5JZAW4K515nj6kVVwPaNWZSMEcR7aFCwL4tQqTcaoprMKTTtm6Zg/1/*)#mr3llm7f",
    "timestamp": 1634652324,
    "active": true,
    "internal": true,
    "range": [
      0,
      999
    ],
    "next": 0
  }
]
$ ./src/bitcoin-cli -regtest importdescriptors "$(cat regtest-descriptors.txt)"
[
  {
    "success": true
  }
]
$ ./src/bitcoin-cli -regtest getwalletinfo
error: timeout on transient error: Could not connect to the server 127.0.0.1:18443 (error code 1 - "EOF reached")

Bug reported by Josef Vondrlik (josef-v).

Github-Pull: #23333
Rebased-From: 6911ab95f1
(cherry picked from commit 227ae652542451834faddbaffb54fc384e9156e6)
2022-12-07 11:11:30 +00:00
..
test Fix build with Boost 1.77.0 2022-08-01 15:35:07 -07:00
bdb.cpp scripted-diff: remove MakeUnique<T>() 2021-03-11 13:45:14 +08:00
bdb.h wallet: Add BerkeleyDB version sanity check at init time 2021-01-17 18:10:20 +01:00
coincontrol.cpp refactor: Drop CCoinControl::SetNull 2021-04-18 21:10:47 +01:00
coincontrol.h Merge 32692d2681 into merged_master (Bitcoin PR bitcoin/bitcoin#21359) 2021-07-08 16:08:49 +00:00
coinselection.cpp wallet: Use GetSelectionAmount for target value calculations 2022-08-01 15:35:06 -07:00
coinselection.h Merge 6b254814c0 into merged_master (Bitcoin PR bitcoin/bitcoin#17331) 2021-07-17 02:42:16 +00:00
context.cpp
context.h
crypter.cpp refactor: Replace &foo[0] with foo.data() 2021-05-04 06:55:31 +02:00
crypter.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
db.cpp Merge bitcoin/bitcoin#21944: wallet: Fix issues when walletdir is root directory 2021-06-09 22:53:36 +12:00
db.h refactor: post Optional<> removal cleanups 2021-03-17 14:56:20 +08:00
dump.cpp refactor: move first run detection to client code 2021-05-19 08:50:16 +02:00
dump.h wallettool: Add createfromdump command 2020-12-16 12:33:06 -05:00
external_signer_scriptpubkeyman.cpp Merge bitcoin/bitcoin#21365: Basic Taproot signing support for descriptor wallets 2021-06-18 09:12:44 +12:00
external_signer_scriptpubkeyman.h refactor: remove m_internal from DescriptorSPKman 2021-06-30 08:37:50 +02:00
feebumper.cpp Merge 7aa41fc581 into merged_master (Bitcoin PR bitcoin/bitcoin#22042) 2021-07-17 19:14:17 +00:00
feebumper.h
fees.cpp scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
fees.h
init.cpp Merge bitcoin/bitcoin#18418: wallet: Increase OUTPUT_GROUP_MAX_ENTRIES to 100 2021-05-26 19:32:51 +08:00
interfaces.cpp Elements-qt: Correctly display the amount in the sender's wallet after using Send button 2022-08-31 19:12:50 -03:00
ismine.h Merge 16ae3368f2 into merged_master (Bitcoin PR #17350) 2021-06-18 20:50:35 +00:00
load.cpp fs: Make compatible with boost 1.78 2022-09-01 14:36:37 -03:00
load.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
receive.cpp Merge 9a154599fe into merged_master (Elements PR ElementsProject/elements#900) 2021-09-04 19:34:14 +00:00
receive.h Merge 55a156fca0 into merged_master (Bitcoin PR bitcoin/bitcoin#21207) 2021-07-19 03:15:44 +00:00
rpcdump.cpp Allow dumpblinding key to accept non-CT address 2022-08-02 13:29:05 -07:00
rpcwallet.cpp wallet, rpc: Add include_explicit to walletcreatefundedpsbt 2022-10-18 16:52:31 -04:00
rpcwallet.h refactor: replace util::Ref by std::any (C++17) 2021-03-29 23:29:42 +02:00
salvage.cpp refactor: Replace &foo[0] with foo.data() 2021-05-04 06:55:31 +02:00
salvage.h
scriptpubkeyman.cpp Merge 1ba24fe9b3 into merged_master (Elements PR ElementsProject/elements#1002) 2021-09-04 22:14:42 +00:00
scriptpubkeyman.h Merge 5341c3b1b3 into merged_master (Bitcoin PR bitcoin/bitcoin#22461) 2021-08-02 23:08:58 +00:00
spend.cpp wallet: account for issuances during coin selection 2022-09-26 14:11:31 -03:00
spend.h Merge 388d47f9a3 into merged_master (Elements PR ElementsProject/elements#1010) 2021-09-18 15:46:10 +00:00
sqlite.cpp wallet: refactor: dedup sqlite PRAGMA assignments 2021-05-17 17:22:36 +02:00
sqlite.h doc: fix various typos 2021-01-04 12:31:31 +08:00
transaction.cpp MOVEONLY: CWallet transaction code out of wallet.cpp/.h 2021-05-26 06:32:51 -05:00
transaction.h Merge 5cf92c32d1 into merged_master (Bitcoin PR bitcoin/bitcoin#21969) 2021-07-20 02:11:14 +00:00
wallet.cpp wallet: fix segfault by avoiding invalid default-ctored external_spk_managers entry 2022-12-07 11:11:30 +00:00
wallet.h wallet: Add include_explicit to FillPSBT 2022-10-18 16:52:31 -04:00
walletdb.cpp Merge 045bb06ebd into merged_master (Bitcoin PR bitcoin/bitcoin#19651) 2021-07-29 23:12:48 +00:00
walletdb.h Merge 045bb06ebd into merged_master (Bitcoin PR bitcoin/bitcoin#19651) 2021-07-29 23:12:48 +00:00
wallettool.cpp refactor: move first run detection to client code 2021-05-19 08:50:16 +02:00
wallettool.h refactor: Move all command dependend checks to ExecuteWalletToolFunc 2021-01-21 19:30:34 +01:00
walletutil.cpp Merge c1604483d3 into merged_master (Bitcoin PR #20566) 2021-06-11 03:34:33 +00:00
walletutil.h wallet: Upgrade existing descriptor caches 2021-06-24 13:49:22 -04:00