diff options
author | fanquake <fanquake@gmail.com> | 2021-12-10 08:44:41 +0800 |
---|---|---|
committer | fanquake <fanquake@gmail.com> | 2021-12-10 09:17:35 +0800 |
commit | 09ad512369a5ff717518dfb1ed19a45097e65ad3 (patch) | |
tree | d74198f29ce88d3241402cd5537fa61ec866d3b1 /src/wallet/wallet.cpp | |
parent | 2f26d8ec703c1cfdc0d883501d7b327335e1b602 (diff) | |
parent | 5493e925013245d5ad0f7ea8784fe07f531803d0 (diff) |
Merge bitcoin/bitcoin#23628: Check descriptors returned by external signers
5493e925013245d5ad0f7ea8784fe07f531803d0 Check descriptors returned by external signers (sstone)
Pull request description:
Check that descriptors returned by external signers have been parsed properly when creating a new wallet.
See https://github.com/bitcoin/bitcoin/issues/23627 for context.
The problem is that parsing an invalid descriptor will return `null` which is not checked for in `CWallet::SetupDescriptorScriptPubKeyMans()`.
I'm not completely sure what the best fix is since there several strategies for dealing with errors in the current codebase but the proposed fix is very simple and consistent with other validation checks in `CWallet::SetupDescriptorScriptPubKeyMans()`.
ACKs for top commit:
jamesob:
Code review ACK https://github.com/bitcoin/bitcoin/pull/23628/commits/5493e925013245d5ad0f7ea8784fe07f531803d0
achow101:
ACK 5493e925013245d5ad0f7ea8784fe07f531803d0
Tree-SHA512: 63259f4aa519405a86c554b6813efdb741314bdaa18bf005b70ea8bb92a27abc6e2b65f7c584641dc257fc78a6499f42b51b5310c243e611c4663430dccf3d04
Diffstat (limited to 'src/wallet/wallet.cpp')
-rw-r--r-- | src/wallet/wallet.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index cfe550cb3f..c79e917c69 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3208,8 +3208,11 @@ void CWallet::SetupDescriptorScriptPubKeyMans() for (const UniValue& desc_val : descriptor_vals.get_array().getValues()) { std::string desc_str = desc_val.getValStr(); FlatSigningProvider keys; - std::string dummy_error; - std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, dummy_error, false); + std::string desc_error; + std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, desc_error, false); + if (desc == nullptr) { + throw std::runtime_error(std::string(__func__) + ": Invalid descriptor \"" + desc_str + "\" (" + desc_error + ")"); + } if (!desc->GetOutputType()) { continue; } |