Skip to content

Commit 5f089aa

Browse files
apoelstraoleonardolima
authored andcommitted
key_map: handle lookup errors on multipath xprivs correctly
1 parent c7d4171 commit 5f089aa

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
@@ -29,6 +29,8 @@ impl GetKey for KeyMapWrapper {
2929
.find_map(|(_desc_pk, desc_sk)| -> Option<PrivateKey> {
3030
match desc_sk.get_key(key_request.clone(), secp) {
3131
Ok(Some(pk)) => Some(pk),
32+
// When looking up keys in a map, we eat errors on individual keys, on
33+
// the assumption that some other key in the map might not error.
3234
Ok(None) | Err(_) => None,
3335
}
3436
}))
@@ -90,12 +92,15 @@ impl GetKey for DescriptorSecretKey {
9092
(
9193
desc_multi_sk @ DescriptorSecretKey::MultiXPrv(_descriptor_multi_xkey),
9294
key_request,
93-
) => Ok(desc_multi_sk.clone().into_single_keys().iter().find_map(
94-
|desc_sk| match desc_sk.get_key(key_request.clone(), secp) {
95-
Ok(Some(pk)) => Some(pk),
96-
Ok(None) | Err(_) => None,
97-
},
98-
)),
95+
) => {
96+
for desc_sk in &desc_multi_sk.clone().into_single_keys() {
97+
// If any key is an error, then all of them will, so here we propagate errors with ?.
98+
if let Some(pk) = desc_sk.get_key(key_request.clone(), secp)? {
99+
return Ok(Some(pk));
100+
}
101+
}
102+
Ok(None)
103+
}
99104
_ => Ok(None),
100105
}
101106
}

0 commit comments

Comments
 (0)