Skip to content

Commit fcb6e72

Browse files
committed
Make ScriptParser.TryParse more safe
1 parent fa38eea commit fcb6e72

3 files changed

Lines changed: 20 additions & 1 deletion

File tree

NBitcoin.Tests/Generators/ScriptGenerator.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ namespace NBitcoin.Tests.Generators
99
public class ScriptGenerator
1010
{
1111

12+
public static Arbitrary<Script> RandomScriptArb()
13+
=> Arb.From(RandomScriptSig());
14+
1215
#region script sig
1316
// -------- legacy -------
1417
// 1. p2pkh scriptSig

NBitcoin.Tests/MiniscriptTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public MiniscriptTests()
2020
{
2121
Arb.Register<AbstractPolicyGenerator>();
2222
Arb.Register<CryptoGenerator>();
23+
Arb.Register<ScriptGenerator>();
2324
Network = Network.Main;
2425
Keys = new Key[] { new Key(), new Key(), new Key() };
2526
}
@@ -440,5 +441,11 @@ public void ShouldPlayWellWithTransactionBuilder_2()
440441
b2.SetRelativeLockTimeTo(coins, 10000);
441442
Assert.True(b2.Verify(b2.BuildTransaction(true)));
442443
}
444+
[Property]
445+
[Trait("PropertyTest", "Verification")]
446+
public void ShouldNotThrowErrorWhenTryParsingScript(Script sc)
447+
{
448+
Miniscript.Miniscript.TryParseScript(sc, out var res);
449+
}
443450
}
444451
}

NBitcoin/Miniscript/Parser/Parser.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,16 @@ internal static ParserResult<ScriptToken, T> TryParse<T>(this Parser<ScriptToken
5454
if (input == null)
5555
throw new System.ArgumentNullException(nameof(input));
5656

57-
return parser(new ScriptInput(input));
57+
try
58+
{
59+
return parser(new ScriptInput(input));
60+
}
61+
// Catching exception here is bit ugly, but converting `Script` to `ScriptToken` is itself unsafe
62+
// so this is good for assuring pureness of this method.
63+
catch (ParseException e)
64+
{
65+
return ParserResult<ScriptToken, T>.Failure(new ScriptInput(new ScriptToken[]{}), e.Message);
66+
}
5867
}
5968

6069
internal static T Parse<T>(this Parser<ScriptToken, T> parser, Script input)

0 commit comments

Comments
 (0)