Skip to content

Commit ce9c50f

Browse files
committed
Merge #810: Backport of #809: fix crash in Descriptor::parse_desc
212d78a bump patch version of 12.3 (Andrew Poelstra) 4c6366a add regression test for #806 (Andrew Poelstra) 4823d86 descriptor: fix key parsing error handling in parse_desc (Andrew Poelstra) Pull request description: Backports #809 and does another patch release. ACKs for top commit: sanket1729: reACK 212d78a Tree-SHA512: c95651f29e1bcb4e8c8036b2a74443c3fd818d39c259852d5c35f0f5ef88fbbe18b312eb7e4d29c39a4af8e9660871fbe998d86c9d21a3d502f1d9854f6f7a43
2 parents 9d658a9 + 212d78a commit ce9c50f

File tree

5 files changed

+37
-13
lines changed

5 files changed

+37
-13
lines changed

Cargo-minimal.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ dependencies = [
316316

317317
[[package]]
318318
name = "miniscript"
319-
version = "12.3.1"
319+
version = "12.3.2"
320320
dependencies = [
321321
"bech32",
322322
"bitcoin",

Cargo-recent.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ dependencies = [
294294

295295
[[package]]
296296
name = "miniscript"
297-
version = "12.3.1"
297+
version = "12.3.2"
298298
dependencies = [
299299
"bech32",
300300
"bitcoin",

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "miniscript"
3-
version = "12.3.1"
3+
version = "12.3.2"
44
authors = ["Andrew Poelstra <[email protected]>, Sanket Kanjalkar <[email protected]>"]
55
license = "CC0-1.0"
66
homepage = "https://github.com/rust-bitcoin/rust-miniscript/"

src/descriptor/mod.rs

+18-6
Original file line numberDiff line numberDiff line change
@@ -731,12 +731,9 @@ impl Descriptor<DescriptorPublicKey> {
731731
}
732732

733733
let descriptor = Descriptor::<String>::from_str(s)?;
734-
let descriptor = descriptor.translate_pk(&mut keymap_pk).map_err(|e| {
735-
Error::Unexpected(
736-
e.expect_translator_err("No Outer context errors")
737-
.to_string(),
738-
)
739-
})?;
734+
let descriptor = descriptor
735+
.translate_pk(&mut keymap_pk)
736+
.map_err(TranslateErr::flatten)?;
740737

741738
Ok((descriptor, keymap_pk.0))
742739
}
@@ -2052,4 +2049,19 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
20522049
Desc::from_str(&format!("tr({},pk({}))", x_only_key, uncomp_key)).unwrap_err();
20532050
Desc::from_str(&format!("tr({},pk({}))", x_only_key, x_only_key)).unwrap();
20542051
}
2052+
2053+
#[test]
2054+
fn regression_806() {
2055+
let secp = secp256k1::Secp256k1::signing_only();
2056+
type Desc = Descriptor<DescriptorPublicKey>;
2057+
// OK
2058+
Desc::from_str("pkh(111111111111111111111111111111110000008375319363688624584A111111)")
2059+
.unwrap_err();
2060+
// ERR: crashes in translate_pk
2061+
Desc::parse_descriptor(
2062+
&secp,
2063+
"pkh(111111111111111111111111111111110000008375319363688624584A111111)",
2064+
)
2065+
.unwrap_err();
2066+
}
20552067
}

src/lib.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -350,10 +350,22 @@ impl<E> TranslateErr<E> {
350350
///
351351
/// This function will panic if the Error is OutError.
352352
pub fn expect_translator_err(self, msg: &str) -> E {
353-
if let Self::TranslatorErr(v) = self {
354-
v
355-
} else {
356-
panic!("{}", msg)
353+
match self {
354+
Self::TranslatorErr(v) => v,
355+
Self::OuterError(ref e) => {
356+
panic!("Unexpected Miniscript error when translating: {}\nMessage: {}", e, msg)
357+
}
358+
}
359+
}
360+
}
361+
362+
impl TranslateErr<Error> {
363+
/// If we are doing a translation where our "outer error" is the generic
364+
/// Miniscript error, eliminate the `TranslateErr` type which is just noise.
365+
pub fn flatten(self) -> Error {
366+
match self {
367+
Self::TranslatorErr(e) => e,
368+
Self::OuterError(e) => e,
357369
}
358370
}
359371
}

0 commit comments

Comments
 (0)