Browse Source

Avoid crashing on invalid certain forms of invalid metadata (found in obfuscated assemblies)

pull/2566/head
Daniel Grunwald 4 years ago
parent
commit
9bbb944e97
  1. 8
      ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs
  2. 5
      ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs

8
ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs

@ -1432,6 +1432,10 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver @@ -1432,6 +1432,10 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
TypeCode code = ReflectionHelper.GetTypeCode(underlyingType);
if (code >= TypeCode.Boolean && code <= TypeCode.Decimal && expression.ConstantValue != null)
{
if (expression.ConstantValue is string)
{
return new ErrorResolveResult(targetType);
}
try
{
return new ConstantResolveResult(targetType, CSharpPrimitiveCast(code, expression.ConstantValue));
@ -1454,6 +1458,10 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver @@ -1454,6 +1458,10 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
}
else if ((underlyingType.Kind == TypeKind.NInt || underlyingType.Kind == TypeKind.NUInt) && expression.ConstantValue != null)
{
if (expression.ConstantValue is string)
{
return new ErrorResolveResult(targetType);
}
code = (underlyingType.Kind == TypeKind.NInt ? TypeCode.Int32 : TypeCode.UInt32);
try
{

5
ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs

@ -471,7 +471,10 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -471,7 +471,10 @@ namespace ICSharpCode.Decompiler.TypeSystem
IMethod ResolveMethodReference(MemberReferenceHandle memberRefHandle, GenericContext context, IReadOnlyList<IType> methodTypeArguments = null, bool expandVarArgs = true)
{
var memberRef = metadata.GetMemberReference(memberRefHandle);
Debug.Assert(memberRef.GetKind() == MemberReferenceKind.Method);
if (memberRef.GetKind() != MemberReferenceKind.Method)
{
throw new BadImageFormatException($"Member reference must be method, but was: {memberRef.GetKind()}");
}
MethodSignature<IType> signature;
IReadOnlyList<IType> classTypeArguments = null;
IMethod method;

Loading…
Cancel
Save