Skip to content

Commit 78cddab

Browse files
committed
key_map: handle lookup errors on multipath xprivs correctly
1 parent 8331d55 commit 78cddab

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

src/descriptor/key_map.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ impl GetKey for KeyMap {
9292
.find_map(|(_desc_pk, desc_sk)| -> Option<PrivateKey> {
9393
match desc_sk.get_key(key_request.clone(), secp) {
9494
Ok(Some(pk)) => Some(pk),
95+
// When looking up keys in a map, we eat errors on individual keys, on
96+
// the assumption that some other key in the map might not error.
9597
Ok(None) | Err(_) => None,
9698
}
9799
}))
@@ -153,12 +155,15 @@ impl GetKey for DescriptorSecretKey {
153155
(
154156
desc_multi_sk @ DescriptorSecretKey::MultiXPrv(_descriptor_multi_xkey),
155157
key_request,
156-
) => Ok(desc_multi_sk.clone().into_single_keys().iter().find_map(
157-
|desc_sk| match desc_sk.get_key(key_request.clone(), secp) {
158-
Ok(Some(pk)) => Some(pk),
159-
Ok(None) | Err(_) => None,
160-
},
161-
)),
158+
) => {
159+
for desc_sk in &desc_multi_sk.clone().into_single_keys() {
160+
// If any key is an error, then all of them will, so here we propagate errors with ?.
161+
if let Some(pk) = desc_sk.get_key(key_request.clone(), secp)? {
162+
return Ok(Some(pk));
163+
}
164+
}
165+
Ok(None)
166+
}
162167
_ => Ok(None),
163168
}
164169
}

0 commit comments

Comments
 (0)