Skip to content

Commit b6023a5

Browse files
buyaa-njtschuster
authored andcommitted
Add NrbfDecoder Fuzzer (dotnet#107385)
1 parent 3b04cbb commit b6023a5

File tree

7 files changed

+159
-9
lines changed

7 files changed

+159
-9
lines changed

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

+8
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

+11
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))
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

+4
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,8 @@
3030
</None>
3131
</ItemGroup>
3232

33+
<ItemGroup>
34+
<ProjectReference Include="..\..\System.Formats.Nrbf\src\System.Formats.Nrbf.csproj" />
35+
</ItemGroup>
36+
3337
</Project>

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

+6-6
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
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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> inputPoisonedAfter = PooledBoundedMemory<byte>.Rent(bytes, PoisonPagePlacement.After);
22+
using PooledBoundedMemory<byte> inputPoisonedBefore = PooledBoundedMemory<byte>.Rent(bytes, PoisonPagePlacement.Before);
23+
using MemoryStream streamAfter = new MemoryStream(inputPoisonedAfter.Memory.ToArray());
24+
using MemoryStream streamBefore = new MemoryStream(inputPoisonedBefore.Memory.ToArray());
25+
26+
Test(inputPoisonedAfter.Span, streamAfter);
27+
Test(inputPoisonedBefore.Span, streamBefore);
28+
}
29+
30+
private static void Test(Span<byte> testSpan, MemoryStream stream)
31+
{
32+
if (NrbfDecoder.StartsWithPayloadHeader(testSpan))
33+
{
34+
try
35+
{
36+
SerializationRecord record = NrbfDecoder.Decode(stream, out IReadOnlyDictionary<SerializationRecordId, SerializationRecord> recordMap);
37+
switch (record.RecordType)
38+
{
39+
case SerializationRecordType.ArraySingleObject:
40+
SZArrayRecord<object?> arrayObj = (SZArrayRecord<object?>)record;
41+
object?[] objArray = arrayObj.GetArray();
42+
Assert.Equal(arrayObj.Length, objArray.Length);
43+
Assert.Equal(1, arrayObj.Rank);
44+
break;
45+
case SerializationRecordType.ArraySingleString:
46+
SZArrayRecord<string?> arrayString = (SZArrayRecord<string?>)record;
47+
string?[] array = arrayString.GetArray();
48+
Assert.Equal(arrayString.Length, array.Length);
49+
Assert.Equal(1, arrayString.Rank);
50+
Assert.Equal(true, arrayString.TypeNameMatches(typeof(string[])));
51+
break;
52+
case SerializationRecordType.ArraySinglePrimitive:
53+
case SerializationRecordType.BinaryArray:
54+
ArrayRecord arrayBinary = (ArrayRecord)record;
55+
Assert.NotNull(arrayBinary.TypeName);
56+
break;
57+
case SerializationRecordType.BinaryObjectString:
58+
_ = ((PrimitiveTypeRecord<string>)record).Value;
59+
break;
60+
case SerializationRecordType.ClassWithId:
61+
case SerializationRecordType.ClassWithMembersAndTypes:
62+
case SerializationRecordType.SystemClassWithMembersAndTypes:
63+
ClassRecord classRecord = (ClassRecord)record;
64+
Assert.NotNull(classRecord.TypeName);
65+
66+
foreach (string name in classRecord.MemberNames)
67+
{
68+
Assert.Equal(true, classRecord.HasMember(name));
69+
}
70+
break;
71+
case SerializationRecordType.MemberPrimitiveTyped:
72+
PrimitiveTypeRecord primitiveType = (PrimitiveTypeRecord)record;
73+
Assert.NotNull(primitiveType.Value);
74+
break;
75+
case SerializationRecordType.MemberReference:
76+
Assert.NotNull(record.TypeName);
77+
break;
78+
case SerializationRecordType.BinaryLibrary:
79+
Assert.Equal(false, record.Id.Equals(default));
80+
break;
81+
case SerializationRecordType.ObjectNull:
82+
case SerializationRecordType.ObjectNullMultiple:
83+
case SerializationRecordType.ObjectNullMultiple256:
84+
Assert.Equal(default, record.Id);
85+
break;
86+
case SerializationRecordType.MessageEnd:
87+
case SerializationRecordType.SerializedStreamHeader:
88+
// case SerializationRecordType.ClassWithMembers: will cause NotSupportedException
89+
// case SerializationRecordType.SystemClassWithMembers: will cause NotSupportedException
90+
default:
91+
throw new Exception("Unexpected RecordType");
92+
}
93+
}
94+
catch (SerializationException) { /* Reading from the stream encountered invalid NRBF data.*/ }
95+
catch (NotSupportedException) { /* Reading from the stream encountered unsupported records */ }
96+
catch (DecoderFallbackException) { /* Reading from the stream encountered an invalid UTF8 sequence. */ }
97+
catch (EndOfStreamException) { /* The end of the stream was reached before reading SerializationRecordType.MessageEnd record. */ }
98+
catch (IOException) { /* An I/O error occurred. */ }
99+
}
100+
else
101+
{
102+
try
103+
{
104+
NrbfDecoder.Decode(stream);
105+
throw new Exception("Decoding supposed to fail!");
106+
}
107+
catch (SerializationException) { /* Everything has to start with a header */ }
108+
catch (NotSupportedException) { /* Reading from the stream encountered unsupported records */ }
109+
catch (EndOfStreamException) { /* The end of the stream was reached before reading SerializationRecordType.MessageEnd record. */ }
110+
}
111+
}
112+
}
113+
}

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

+1-3
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)