Skip to content

Commit 81d6a4f

Browse files
committed
Reject zero-count Miniscript fragments
1 parent 7bb651f commit 81d6a4f

2 files changed

Lines changed: 14 additions & 1 deletion

File tree

‎NBitcoin.Tests/MiniscriptTests.cs‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,19 @@ public void RejectsNonCanonicalNumbers(string miniscript, bool expected)
8686
Assert.Equal(expected, Miniscript.TryParse(miniscript, settings, out _));
8787
}
8888

89+
[Theory]
90+
[InlineData("thresh(0)", KeyType.Classic)]
91+
[InlineData("multi(0)", KeyType.Classic)]
92+
[InlineData("sortedmulti(0)", KeyType.Classic)]
93+
[InlineData("multi_a(0)", KeyType.Taproot)]
94+
[InlineData("sortedmulti_a(0)", KeyType.Taproot)]
95+
public void RejectsZeroThreshold(string miniscript, KeyType keyType)
96+
{
97+
var settings = new MiniscriptParsingSettings(Network.Main, keyType) { AllowedParameters = ParameterTypeFlags.All };
98+
Assert.False(Miniscript.TryParse(miniscript, settings, out var error, out _));
99+
Assert.IsType<MiniscriptError.CountExpected>(error);
100+
}
101+
89102
[Theory]
90103
[InlineData(ParameterTypeFlags.All, "pkh(A)", true)]
91104
[InlineData(ParameterTypeFlags.All, "pkh(@0/**)", true)]

‎NBitcoin/WalletPolicies/Miniscript.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ private static bool TryParseParameterCount(ParsingContext ctx, [MaybeNullWhen(tr
227227
error = new MiniscriptError.CountExpected(ctx.Offset);
228228
return false;
229229
}
230-
if (uint.TryParse(match.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var v) && v < Int32.MaxValue)
230+
if (uint.TryParse(match.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var v) && v > 0 && v < Int32.MaxValue)
231231
{
232232
ctx.Advance(match.Length);
233233
node = new Value.CountValue((int)v);

0 commit comments

Comments
 (0)