Browse Source

Fix #1231: System.BadImageFormatException: Invalid coded index

pull/1218/merge
Siegfried Pammer 7 years ago
parent
commit
b20d4df95b
  1. 6
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  2. 23
      ICSharpCode.Decompiler/SRMExtensions.cs
  3. 5
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs
  4. 3
      ILSpy/TreeNodes/DerivedTypesTreeNode.cs

6
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -1274,13 +1274,15 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -1274,13 +1274,15 @@ namespace ICSharpCode.Decompiler.Disassembler
output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType);
output.WriteLine();
if (!typeDefinition.BaseType.IsNil) {
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
if (!baseType.IsNil) {
output.Indent();
output.Write("extends ");
typeDefinition.BaseType.WriteTo(module, output, genericContext, ILNameSyntax.TypeName);
baseType.WriteTo(module, output, genericContext, ILNameSyntax.TypeName);
output.WriteLine();
output.Unindent();
}
var interfaces = typeDefinition.GetInterfaceImplementations();
if (interfaces.Count > 0) {
output.Indent();

23
ICSharpCode.Decompiler/SRMExtensions.cs

@ -31,7 +31,7 @@ namespace ICSharpCode.Decompiler @@ -31,7 +31,7 @@ namespace ICSharpCode.Decompiler
public static bool IsValueType(this TypeDefinition typeDefinition, MetadataReader reader)
{
var baseType = typeDefinition.BaseType;
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
if (baseType.IsNil)
return false;
if (baseType.IsKnownType(reader, KnownTypeCode.Enum))
@ -49,9 +49,10 @@ namespace ICSharpCode.Decompiler @@ -49,9 +49,10 @@ namespace ICSharpCode.Decompiler
public static bool IsEnum(this TypeDefinition typeDefinition, MetadataReader reader)
{
if (typeDefinition.BaseType.IsNil)
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
if (baseType.IsNil)
return false;
return typeDefinition.BaseType.IsKnownType(reader, KnownTypeCode.Enum);
return baseType.IsKnownType(reader, KnownTypeCode.Enum);
}
public static bool IsEnum(this TypeDefinitionHandle handle, MetadataReader reader, out PrimitiveTypeCode underlyingType)
@ -62,9 +63,10 @@ namespace ICSharpCode.Decompiler @@ -62,9 +63,10 @@ namespace ICSharpCode.Decompiler
public static bool IsEnum(this TypeDefinition typeDefinition, MetadataReader reader, out PrimitiveTypeCode underlyingType)
{
underlyingType = 0;
if (typeDefinition.BaseType.IsNil)
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
if (baseType.IsNil)
return false;
if (!typeDefinition.BaseType.IsKnownType(reader, KnownTypeCode.Enum))
if (!baseType.IsKnownType(reader, KnownTypeCode.Enum))
return false;
var field = reader.GetFieldDefinition(typeDefinition.GetFields().First());
var blob = reader.GetBlobReader(field.Signature);
@ -81,7 +83,7 @@ namespace ICSharpCode.Decompiler @@ -81,7 +83,7 @@ namespace ICSharpCode.Decompiler
public static bool IsDelegate(this TypeDefinition typeDefinition, MetadataReader reader)
{
var baseType = typeDefinition.BaseType;
var baseType = typeDefinition.GetBaseTypeOrNil();
return !baseType.IsNil && baseType.IsKnownType(reader, KnownTypeCode.MulticastDelegate);
}
@ -411,5 +413,14 @@ namespace ICSharpCode.Decompiler @@ -411,5 +413,14 @@ namespace ICSharpCode.Decompiler
return reader.GetTypeSpecification(handle).DecodeSignature(this, genericContext);
}
}
public static EntityHandle GetBaseTypeOrNil(this TypeDefinition definition)
{
try {
return definition.BaseType;
} catch (BadImageFormatException) {
return default;
}
}
}
}

5
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs

@ -270,8 +270,9 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -270,8 +270,9 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
var context = new GenericContext(TypeParameters);
var interfaceImplCollection = td.GetInterfaceImplementations();
baseTypes = new List<IType>(1 + interfaceImplCollection.Count);
if (!td.BaseType.IsNil) {
baseTypes.Add(module.ResolveType(td.BaseType, context));
EntityHandle baseType = td.GetBaseTypeOrNil();
if (!baseType.IsNil) {
baseTypes.Add(module.ResolveType(baseType, context));
} else if (Kind == TypeKind.Interface) {
// td.BaseType.IsNil is always true for interfaces,
// but the type system expects every interface to derive from System.Object as well.

3
ILSpy/TreeNodes/DerivedTypesTreeNode.cs

@ -76,7 +76,8 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -76,7 +76,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
if (IsSameType(metadata, ifaceImpl.Interface, definitionMetadata, metadataToken))
yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h));
}
if (!td.BaseType.IsNil && IsSameType(metadata, td.BaseType, definitionMetadata, metadataToken)) {
SRM.EntityHandle baseType = td.GetBaseTypeOrNil();
if (!baseType.IsNil && IsSameType(metadata, baseType, definitionMetadata, metadataToken)) {
yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h));
}
}

Loading…
Cancel
Save