aboutsummaryrefslogtreecommitdiff
path: root/src/wallet
diff options
context:
space:
mode:
authorfanquake <fanquake@gmail.com>2021-12-10 08:44:41 +0800
committerfanquake <fanquake@gmail.com>2021-12-10 09:17:35 +0800
commit09ad512369a5ff717518dfb1ed19a45097e65ad3 (patch)
treed74198f29ce88d3241402cd5537fa61ec866d3b1 /src/wallet
parent2f26d8ec703c1cfdc0d883501d7b327335e1b602 (diff)
parent5493e925013245d5ad0f7ea8784fe07f531803d0 (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')
-rw-r--r--src/wallet/wallet.cpp7
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;
}