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

5
ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs

@ -471,7 +471,10 @@ namespace ICSharpCode.Decompiler.TypeSystem
IMethod ResolveMethodReference(MemberReferenceHandle memberRefHandle, GenericContext context, IReadOnlyList<IType> methodTypeArguments = null, bool expandVarArgs = true) IMethod ResolveMethodReference(MemberReferenceHandle memberRefHandle, GenericContext context, IReadOnlyList<IType> methodTypeArguments = null, bool expandVarArgs = true)
{ {
var memberRef = metadata.GetMemberReference(memberRefHandle); 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; MethodSignature<IType> signature;
IReadOnlyList<IType> classTypeArguments = null; IReadOnlyList<IType> classTypeArguments = null;
IMethod method; IMethod method;

Loading…
Cancel
Save