Skip to content

Commit b89443d

Browse files
committed
Add NrbfDecoderFuzzer
1 parent 46c9a4f commit b89443d

File tree

7 files changed

+150
-9
lines changed

7 files changed

+150
-9
lines changed

eng/pipelines/libraries/fuzzing/deploy-to-onefuzz.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ extends:
105105
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
106106
displayName: Send JsonDocumentFuzzer to OneFuzz
107107

108+
- task: onefuzz-task@0
109+
inputs:
110+
onefuzzOSes: 'Windows'
111+
env:
112+
onefuzzDropDirectory: $(fuzzerProject)/deployment/NrbfDecoderFuzzer
113+
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
114+
displayName: Send NrbfDecoderFuzzer to OneFuzz
115+
108116
- task: onefuzz-task@0
109117
inputs:
110118
onefuzzOSes: 'Windows'

src/libraries/Fuzzing/DotnetFuzzing/Assert.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@ static void Throw(T expected, T actual) =>
1818
throw new Exception($"Expected={expected} Actual={actual}");
1919
}
2020

21+
public static void NotNull<T>(T value)
22+
{
23+
if (value == null)
24+
{
25+
ThrowNull();
26+
}
27+
28+
static void ThrowNull() =>
29+
throw new Exception("Value is null");
30+
}
31+
2132
public static void SequenceEqual<T>(ReadOnlySpan<T> expected, ReadOnlySpan<T> actual)
2233
{
2334
if (!expected.SequenceEqual(actual))
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# "Hello World!"
2+
"\x00\x01\x00\x00\x00\xFF\xFF\xFF\xFF\x01\x00\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x0C\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21\x0B"
3+
# new DateTime(2024, 2, 29)
4+
"\x00\x01\x00\x00\x00\xFF\xFF\xFF\xFF\x01\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x0F\x53\x79\x73\x74\x65\x6D\x2E\x44\x61\x74\x65\x54\x69\x6D\x65\x02\x00\x00\x00\x05\x74\x69\x63\x6B\x73\x08\x64\x61\x74\x65\x44\x61\x74\x61\x00\x00\x09\x10\x00\x00\x60\x5F\xB9\x38\xDC\x08\x00\x00\x60\x5F\xB9\x38\xDC\x08\x0B"
5+
# new int[] { 1, 2, 3 }
6+
"\x00\x01\x00\x00\x00\xFF\xFF\xFF\xFF\x01\x00\x00\x00\x00\x00\x00\x00\x0F\x01\x00\x00\x00\x03\x00\x00\x00\x08\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x0B"
7+
# new object[] { int.MaxValue, "string", null }
8+
"\x00\x01\x00\x00\x00\xFF\xFF\xFF\xFF\x01\x00\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x03\x00\x00\x00\x08\x08\xFF\xFF\xFF\x7F\x06\x02\x00\x00\x00\x06\x73\x74\x72\x69\x6E\x67\x0A\x0B"
9+
# new int?[Array.MaxLength] (plenty of nulls)
10+
"\x00\x01\x00\x00\x00\xFF\xFF\xFF\xFF\x01\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x01\x00\x00\x00\xC7\xFF\xFF\x7F\x03\x6E\x53\x79\x73\x74\x65\x6D\x2E\x4E\x75\x6C\x6C\x61\x62\x6C\x65\x60\x31\x5B\x5B\x53\x79\x73\x74\x65\x6D\x2E\x49\x6E\x74\x33\x32\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x5D\x0E\xC7\xFF\xFF\x7F\x0B"
11+
# [["jagged", "array"], ["of", "strings"]]
12+
"\x00\x01\x00\x00\x00\xFF\xFF\xFF\xFF\x01\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x01\x01\x00\x00\x00\x02\x00\x00\x00\x06\x09\x02\x00\x00\x00\x09\x03\x00\x00\x00\x11\x02\x00\x00\x00\x02\x00\x00\x00\x06\x04\x00\x00\x00\x06\x6A\x61\x67\x67\x65\x64\x06\x05\x00\x00\x00\x05\x61\x72\x72\x61\x79\x11\x03\x00\x00\x00\x02\x00\x00\x00\x06\x06\x00\x00\x00\x02\x6F\x66\x06\x07\x00\x00\x00\x07\x73\x74\x72\x69\x6E\x67\x73\x0B"
13+
# new Dictionary<string, bool> { { "1", true }, { "2", false } }
14+
"\x00\x01\x00\x00\x00\xFF\xFF\xFF\xFF\x01\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\xE3\x01\x53\x79\x73\x74\x65\x6D\x2E\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E\x73\x2E\x47\x65\x6E\x65\x72\x69\x63\x2E\x44\x69\x63\x74\x69\x6F\x6E\x61\x72\x79\x60\x32\x5B\x5B\x53\x79\x73\x74\x65\x6D\x2E\x53\x74\x72\x69\x6E\x67\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x2C\x5B\x53\x79\x73\x74\x65\x6D\x2E\x42\x6F\x6F\x6C\x65\x61\x6E\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x5D\x04\x00\x00\x00\x07\x56\x65\x72\x73\x69\x6F\x6E\x08\x43\x6F\x6D\x70\x61\x72\x65\x72\x08\x48\x61\x73\x68\x53\x69\x7A\x65\x0D\x4B\x65\x79\x56\x61\x6C\x75\x65\x50\x61\x69\x72\x73\x00\x03\x00\x03\x08\x92\x01\x53\x79\x73\x74\x65\x6D\x2E\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E\x73\x2E\x47\x65\x6E\x65\x72\x69\x63\x2E\x47\x65\x6E\x65\x72\x69\x63\x45\x71\x75\x61\x6C\x69\x74\x79\x43\x6F\x6D\x70\x61\x72\x65\x72\x60\x31\x5B\x5B\x53\x79\x73\x74\x65\x6D\x2E\x53\x74\x72\x69\x6E\x67\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x5D\x08\xE7\x01\x53\x79\x73\x74\x65\x6D\x2E\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E\x73\x2E\x47\x65\x6E\x65\x72\x69\x63\x2E\x4B\x65\x79\x56\x61\x6C\x75\x65\x50\x61\x69\x72\x60\x32\x5B\x5B\x53\x79\x73\x74\x65\x6D\x2E\x53\x74\x72\x69\x6E\x67\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x2C\x5B\x53\x79\x73\x74\x65\x6D\x2E\x42\x6F\x6F\x6C\x65\x61\x6E\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x5D\x5B\x5D\x02\x00\x00\x00\x09\x02\x00\x00\x00\x03\x00\x00\x00\x09\x03\x00\x00\x00\x04\x02\x00\x00\x00\x92\x01\x53\x79\x73\x74\x65\x6D\x2E\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E\x73\x2E\x47\x65\x6E\x65\x72\x69\x63\x2E\x47\x65\x6E\x65\x72\x69\x63\x45\x71\x75\x61\x6C\x69\x74\x79\x43\x6F\x6D\x70\x61\x72\x65\x72\x60\x31\x5B\x5B\x53\x79\x73\x74\x65\x6D\x2E\x53\x74\x72\x69\x6E\x67\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x5D\x00\x00\x00\x00\x07\x03\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xE5\x01\x53\x79\x73\x74\x65\x6D\x2E\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E\x73\x2E\x47\x65\x6E\x65\x72\x69\x63\x2E\x4B\x65\x79\x56\x61\x6C\x75\x65\x50\x61\x69\x72\x60\x32\x5B\x5B\x53\x79\x73\x74\x65\x6D\x2E\x53\x74\x72\x69\x6E\x67\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x2C\x5B\x53\x79\x73\x74\x65\x6D\x2E\x42\x6F\x6F\x6C\x65\x61\x6E\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x5D\x04\xFC\xFF\xFF\xFF\xE5\x01\x53\x79\x73\x74\x65\x6D\x2E\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E\x73\x2E\x47\x65\x6E\x65\x72\x69\x63\x2E\x4B\x65\x79\x56\x61\x6C\x75\x65\x50\x61\x69\x72\x60\x32\x5B\x5B\x53\x79\x73\x74\x65\x6D\x2E\x53\x74\x72\x69\x6E\x67\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x2C\x5B\x53\x79\x73\x74\x65\x6D\x2E\x42\x6F\x6F\x6C\x65\x61\x6E\x2C\x20\x6D\x73\x63\x6F\x72\x6C\x69\x62\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x34\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x62\x37\x37\x61\x35\x63\x35\x36\x31\x39\x33\x34\x65\x30\x38\x39\x5D\x5D\x02\x00\x00\x00\x03\x6B\x65\x79\x05\x76\x61\x6C\x75\x65\x01\x00\x01\x06\x05\x00\x00\x00\x01\x31\x01\x01\xFA\xFF\xFF\xFF\xFC\xFF\xFF\xFF\x06\x07\x00\x00\x00\x01\x32\x00\x0B"
15+
# new ComplexType2D { I = 1, J = 2 } (non-system class)
16+
"\x00\x01\x00\x00\x00\xFF\xFF\xFF\xFF\x01\x00\x00\x00\x00\x00\x00\x00\x0C\x02\x00\x00\x00\x3D\x42\x66\x44\x65\x6D\x6F\x2C\x20\x56\x65\x72\x73\x69\x6F\x6E\x3D\x31\x2E\x30\x2E\x30\x2E\x30\x2C\x20\x43\x75\x6C\x74\x75\x72\x65\x3D\x6E\x65\x75\x74\x72\x61\x6C\x2C\x20\x50\x75\x62\x6C\x69\x63\x4B\x65\x79\x54\x6F\x6B\x65\x6E\x3D\x6E\x75\x6C\x6C\x05\x01\x00\x00\x00\x14\x42\x66\x44\x65\x6D\x6F\x2E\x43\x6F\x6D\x70\x6C\x65\x78\x54\x79\x70\x65\x32\x44\x02\x00\x00\x00\x01\x49\x01\x4A\x00\x00\x08\x08\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x0B"

src/libraries/Fuzzing/DotnetFuzzing/DotnetFuzzing.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
<ItemGroup>
1515
<PackageReference Include="SharpFuzz" Version="2.1.1" />
16+
<PackageReference Include="System.Formats.Nrbf" Version="9.0.0-preview.7.24405.7" />
1617
</ItemGroup>
1718

1819
<ItemGroup>

src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ public void FuzzTarget(ReadOnlySpan<byte> bytes)
2424
using PooledBoundedMemory<char> inputPoisonedBefore = PooledBoundedMemory<char>.Rent(chars, PoisonPagePlacement.Before);
2525
using PooledBoundedMemory<char> inputPoisonedAfter = PooledBoundedMemory<char>.Rent(chars, PoisonPagePlacement.After);
2626

27-
Test(inputPoisonedBefore);
28-
Test(inputPoisonedAfter);
27+
Test(inputPoisonedBefore.Span);
28+
Test(inputPoisonedAfter.Span);
2929
}
3030

31-
private static void Test(PooledBoundedMemory<char> inputPoisoned)
31+
private static void Test(Span<char> span)
3232
{
33-
if (AssemblyNameInfo.TryParse(inputPoisoned.Span, out AssemblyNameInfo? fromTryParse))
33+
if (AssemblyNameInfo.TryParse(span, out AssemblyNameInfo? fromTryParse))
3434
{
35-
AssemblyNameInfo fromParse = AssemblyNameInfo.Parse(inputPoisoned.Span);
35+
AssemblyNameInfo fromParse = AssemblyNameInfo.Parse(span);
3636

3737
Assert.Equal(fromTryParse.Name, fromParse.Name);
3838
Assert.Equal(fromTryParse.FullName, fromParse.FullName);
@@ -66,7 +66,7 @@ private static void Test(PooledBoundedMemory<char> inputPoisoned)
6666
{
6767
try
6868
{
69-
_ = AssemblyNameInfo.Parse(inputPoisoned.Span);
69+
_ = AssemblyNameInfo.Parse(span);
7070
}
7171
catch (ArgumentException)
7272
{
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Buffers;
5+
using System.Formats.Nrbf;
6+
using System.Runtime.Serialization;
7+
using System.Text;
8+
9+
namespace DotnetFuzzing.Fuzzers
10+
{
11+
internal sealed class NrbfDecoderFuzzer : IFuzzer
12+
{
13+
public string[] TargetAssemblies { get; } = ["System.Formats.Nrbf"];
14+
15+
public string[] TargetCoreLibPrefixes => [];
16+
17+
public string Dictionary => "nrbfdecoder.dict";
18+
19+
public void FuzzTarget(ReadOnlySpan<byte> bytes)
20+
{
21+
using PooledBoundedMemory<byte> inputPoisoned = PooledBoundedMemory<byte>.Rent(bytes, PoisonPagePlacement.After);
22+
using MemoryStream stream = new MemoryStream(inputPoisoned.Memory.ToArray());
23+
24+
if (NrbfDecoder.StartsWithPayloadHeader(inputPoisoned.Span))
25+
{
26+
try
27+
{
28+
SerializationRecord record = NrbfDecoder.Decode(stream, out IReadOnlyDictionary<SerializationRecordId, SerializationRecord> recordMap);
29+
switch (record.RecordType)
30+
{
31+
case SerializationRecordType.ArraySingleObject:
32+
SZArrayRecord<object?> arrayObj = (SZArrayRecord<object?>)record;
33+
object?[] objArray = arrayObj.GetArray();
34+
Assert.Equal(arrayObj.Length, objArray.Length);
35+
Assert.Equal(1, arrayObj.Rank);
36+
break;
37+
case SerializationRecordType.ArraySingleString:
38+
SZArrayRecord<string?> arrayString = (SZArrayRecord<string?>)record;
39+
string?[] array = arrayString.GetArray();
40+
Assert.Equal(arrayString.Length, array.Length);
41+
Assert.Equal(1, arrayString.Rank);
42+
Assert.Equal(true, arrayString.TypeNameMatches(typeof(string[])));
43+
break;
44+
case SerializationRecordType.ArraySinglePrimitive:
45+
case SerializationRecordType.BinaryArray:
46+
ArrayRecord arrayBinary = (ArrayRecord)record;
47+
Assert.NotNull(arrayBinary.TypeName);
48+
break;
49+
case SerializationRecordType.BinaryObjectString:
50+
_ = ((PrimitiveTypeRecord<string>)record).Value;
51+
break;
52+
case SerializationRecordType.ClassWithId:
53+
case SerializationRecordType.ClassWithMembersAndTypes:
54+
case SerializationRecordType.SystemClassWithMembersAndTypes:
55+
{
56+
ClassRecord classRecord = (ClassRecord)record;
57+
Assert.NotNull(classRecord.TypeName);
58+
59+
foreach (string name in classRecord.MemberNames)
60+
{
61+
Assert.Equal(true, classRecord.HasMember(name));
62+
}
63+
} break;
64+
case SerializationRecordType.MemberPrimitiveTyped:
65+
PrimitiveTypeRecord primitiveType = (PrimitiveTypeRecord)record;
66+
Assert.NotNull(primitiveType.Value);
67+
break;
68+
case SerializationRecordType.MemberReference:
69+
Assert.NotNull(record.TypeName);
70+
break;
71+
case SerializationRecordType.BinaryLibrary:
72+
case SerializationRecordType.ObjectNull:
73+
case SerializationRecordType.ObjectNullMultiple:
74+
case SerializationRecordType.ObjectNullMultiple256:
75+
Assert.Equal(default, record.Id);
76+
break;
77+
case SerializationRecordType.MessageEnd:
78+
case SerializationRecordType.SerializedStreamHeader:
79+
// case SerializationRecordType.ClassWithMembers: will cause NotSupportedException
80+
// case SerializationRecordType.SystemClassWithMembers: will cause NotSupportedException
81+
default:
82+
throw new Exception("Unexpected RecordType");
83+
}
84+
}
85+
catch (SerializationException) { /* Reading from the stream encountered invalid NRBF data.*/ }
86+
catch (NotSupportedException) { /* Reading from the stream encountered unsupported records */ }
87+
catch (DecoderFallbackException) { /* Reading from the stream encountered an invalid UTF8 sequence. */ }
88+
catch (EndOfStreamException) { /* The end of the stream was reached before reading SerializationRecordType.MessageEnd record. */ }
89+
}
90+
else
91+
{
92+
try
93+
{
94+
NrbfDecoder.Decode(stream);
95+
throw new Exception("Decoding supposed to fail!");
96+
}
97+
catch (SerializationException) { /* Everything has to start with a header */ }
98+
catch (NotSupportedException) { /* Reading from the stream encountered unsupported records */ }
99+
catch (EndOfStreamException) { /* The end of the stream was reached before reading SerializationRecordType.MessageEnd record. */ }
100+
catch (DecoderFallbackException) { /* Reading from the stream encountered an invalid UTF8 sequence. */ }
101+
// below exceptions are not expected
102+
catch (FormatException) { /* Temporarily catch this until its fixed */ }
103+
catch (IOException) { /* Temporarily catch this until its fixed */ }
104+
}
105+
}
106+
}
107+
}

src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/TypeNameFuzzer.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
using System.Buffers;
55
using System.Reflection.Metadata;
6-
using System.Runtime.InteropServices;
7-
using System.Runtime.InteropServices.Marshalling;
86
using System.Text;
97

108
namespace DotnetFuzzing.Fuzzers
@@ -55,7 +53,7 @@ private static void Test(Span<char> testSpan)
5553
try
5654
{
5755
TypeName.Parse(testSpan);
58-
Assert.Equal(true, false); // should never succeed
56+
throw new Exception("Parsing was supposed to fail!");
5957
}
6058
catch (ArgumentException) { }
6159
catch (InvalidOperationException) { }

0 commit comments

Comments
 (0)