From 75752f73885bf21891635f772b25967546431d86 Mon Sep 17 00:00:00 2001 From: de4dot Date: Mon, 3 Oct 2011 09:36:46 +0200 Subject: [PATCH] Added more checks in case metadata is invalid --- AssemblyData/methodsrewriter/CodeGenerator.cs | 2 +- AssemblyData/methodsrewriter/Resolver.cs | 16 +++++++++++++++- blocks/MemberReferenceHelper.cs | 3 ++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/AssemblyData/methodsrewriter/CodeGenerator.cs b/AssemblyData/methodsrewriter/CodeGenerator.cs index 0bebb076..c1076b11 100644 --- a/AssemblyData/methodsrewriter/CodeGenerator.cs +++ b/AssemblyData/methodsrewriter/CodeGenerator.cs @@ -321,7 +321,7 @@ namespace AssemblyData.methodsrewriter { else if (obj is Type) ilg.Emit(opcode, (Type)obj); else - throw new ApplicationException(string.Format("Unknown type: {0}", obj.GetType())); + throw new ApplicationException(string.Format("Unknown type: {0}", (obj == null ? obj : obj.GetType()))); break; case OperandType.InlineArg: diff --git a/AssemblyData/methodsrewriter/Resolver.cs b/AssemblyData/methodsrewriter/Resolver.cs index a0ba1b75..55127913 100644 --- a/AssemblyData/methodsrewriter/Resolver.cs +++ b/AssemblyData/methodsrewriter/Resolver.cs @@ -65,6 +65,8 @@ namespace AssemblyData.methodsrewriter { } public static MType getType(TypeReference typeReference) { + if (typeReference == null) + return null; var module = getModule(typeReference.Scope); if (module != null) return module.getType(typeReference); @@ -72,6 +74,8 @@ namespace AssemblyData.methodsrewriter { } public static MMethod getMethod(MethodReference methodReference) { + if (methodReference == null) + return null; var module = getModule(methodReference.DeclaringType.Scope); if (module != null) return module.getMethod(methodReference); @@ -79,6 +83,8 @@ namespace AssemblyData.methodsrewriter { } public static MField getField(FieldReference fieldReference) { + if (fieldReference == null) + return null; var module = getModule(fieldReference.DeclaringType.Scope); if (module != null) return module.getField(fieldReference); @@ -86,7 +92,9 @@ namespace AssemblyData.methodsrewriter { } public static object getRtObject(MemberReference memberReference) { - if (memberReference is TypeReference) + if (memberReference == null) + return null; + else if (memberReference is TypeReference) return getRtType((TypeReference)memberReference); else if (memberReference is FieldReference) return getRtField((FieldReference)memberReference); @@ -129,6 +137,8 @@ namespace AssemblyData.methodsrewriter { } static Type resolve(TypeReference typeReference) { + if (typeReference == null) + return null; var elemType = typeReference.GetElementType(); var resolver = getAssemblyResolver(elemType.Scope); var resolvedType = resolver.resolve(elemType); @@ -138,6 +148,8 @@ namespace AssemblyData.methodsrewriter { } static FieldInfo resolve(FieldReference fieldReference) { + if (fieldReference == null) + return null; var resolver = getAssemblyResolver(fieldReference.DeclaringType.Scope); var fieldInfo = resolver.resolve(fieldReference); if (fieldInfo != null) @@ -146,6 +158,8 @@ namespace AssemblyData.methodsrewriter { } static MethodBase resolve(MethodReference methodReference) { + if (methodReference == null) + return null; var resolver = getAssemblyResolver(methodReference.DeclaringType.Scope); var methodBase = resolver.resolve(methodReference); if (methodBase != null) diff --git a/blocks/MemberReferenceHelper.cs b/blocks/MemberReferenceHelper.cs index 4c540a3e..092ed869 100644 --- a/blocks/MemberReferenceHelper.cs +++ b/blocks/MemberReferenceHelper.cs @@ -270,7 +270,8 @@ namespace de4dot.blocks { } public static bool verifyType(TypeReference typeReference, string assembly, string type, string extra = "") { - return MemberReferenceHelper.getCanonicalizedTypeRefName(typeReference.GetElementType()) == "[" + assembly + "]" + type && + return typeReference != null && + MemberReferenceHelper.getCanonicalizedTypeRefName(typeReference.GetElementType()) == "[" + assembly + "]" + type && typeReference.FullName == type + extra; }