-
Notifications
You must be signed in to change notification settings - Fork 4.7k
/
AssemblyNameInfoFuzzer.cs
80 lines (66 loc) · 3.35 KB
/
AssemblyNameInfoFuzzer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Buffers;
using System.Reflection.Metadata;
using System.Runtime.InteropServices;
using System.Text;
namespace DotnetFuzzing.Fuzzers
{
internal sealed class AssemblyNameInfoFuzzer : IFuzzer
{
public string[] TargetAssemblies => ["System.Reflection.Metadata"];
public string[] TargetCoreLibPrefixes => [];
public string Dictionary => "assemblynameinfo.dict";
public void FuzzTarget(ReadOnlySpan<byte> bytes)
{
Span<char> chars = new char[Encoding.UTF8.GetCharCount(bytes)];
Encoding.UTF8.GetChars(bytes, chars);
using PooledBoundedMemory<char> inputPoisonedBefore = PooledBoundedMemory<char>.Rent(chars, PoisonPagePlacement.Before);
using PooledBoundedMemory<char> inputPoisonedAfter = PooledBoundedMemory<char>.Rent(chars, PoisonPagePlacement.After);
Test(inputPoisonedBefore.Span);
Test(inputPoisonedAfter.Span);
}
private static void Test(Span<char> span)
{
if (AssemblyNameInfo.TryParse(span, out AssemblyNameInfo? fromTryParse))
{
AssemblyNameInfo fromParse = AssemblyNameInfo.Parse(span);
Assert.Equal(fromTryParse.Name, fromParse.Name);
Assert.Equal(fromTryParse.FullName, fromParse.FullName);
Assert.Equal(fromTryParse.CultureName, fromParse.CultureName);
Assert.Equal(fromTryParse.Flags, fromParse.Flags);
Assert.Equal(fromTryParse.Version, fromParse.Version);
Assert.SequenceEqual(fromTryParse.PublicKeyOrToken.AsSpan(), fromParse.PublicKeyOrToken.AsSpan());
Assert.Equal(fromTryParse.ToAssemblyName().Name, fromParse.ToAssemblyName().Name);
Assert.Equal(fromTryParse.ToAssemblyName().Version, fromParse.ToAssemblyName().Version);
Assert.Equal(fromTryParse.ToAssemblyName().ContentType, fromParse.ToAssemblyName().ContentType);
Assert.Equal(fromTryParse.ToAssemblyName().CultureName, fromParse.ToAssemblyName().CultureName);
Assert.Equal(fromTryParse.Name, fromParse.ToAssemblyName().Name);
Assert.Equal(fromTryParse.CultureName, fromParse.ToAssemblyName().CultureName);
Assert.Equal(fromTryParse.Version, fromParse.ToAssemblyName().Version);
// AssemblyNameInfo.FullName can be different than AssemblyName.FullName:
// AssemblyNameInfo includes public key, AssemblyName only its Token.
try
{
Assert.Equal(fromTryParse.ToAssemblyName().FullName, fromParse.ToAssemblyName().FullName);
}
catch (System.Security.SecurityException)
{
// AssemblyName.FullName performs public key validation, AssemblyNameInfo does not (on purpose).
}
}
else
{
try
{
_ = AssemblyNameInfo.Parse(span);
}
catch (ArgumentException)
{
return;
}
throw new Exception("Parsing was supposed to fail!");
}
}
}
}