HomePhabricator

wallet: fix segfaults related to ScriptPubKeyMan managing code

Description

wallet: fix segfaults related to ScriptPubKeyMan managing code

Summary:

wallet: erase spkmans rather than setting to nullptr

In many places in ScriptPubKeyMan managing code, we assume that the
ScriptPubKeyMan being retrieved actually exists and is not a nullptr.
Thus removing a ScriptPubKeyMan requires erasing the object from the
map rather than setting it to a nullptr.

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 wallet_name="walleti" 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).

This is a backport of core#22379 and core#23333

Depends on D14207

Test Plan: ninja all check-all

Reviewers: #bitcoin_abc, Fabien

Reviewed By: #bitcoin_abc, Fabien

Differential Revision: https://reviews.bitcoinabc.org/D14208

Details

Provenance
Andrew Chow <achow101-github@achow101.com>Authored on Jul 1 2021, 05:22
PiRKCommitted on Jul 5 2023, 07:13
PiRKPushed on Jul 5 2023, 07:13
Reviewer
Restricted Project
Differential Revision
D14208: wallet: fix segfaults related to ScriptPubKeyMan managing code
Parents
rABC33d78b3c5575: wallet: importdescriptors update existing
Branches
Unknown
Tags
Unknown