Browse Source

Fix #2733: Ignore bad metadata when trying to resolve ResolutionScope

pull/2737/head
Siegfried Pammer 3 years ago
parent
commit
186cc51bf7
  1. 50
      ICSharpCode.Decompiler/SRMExtensions.cs

50
ICSharpCode.Decompiler/SRMExtensions.cs

@ -239,29 +239,37 @@ namespace ICSharpCode.Decompiler
if (handle.IsNil) if (handle.IsNil)
return false; return false;
StringHandle nameHandle, namespaceHandle; StringHandle nameHandle, namespaceHandle;
switch (handle.Kind) try
{ {
case HandleKind.TypeReference: switch (handle.Kind)
var tr = reader.GetTypeReference((TypeReferenceHandle)handle); {
// ignore exported and nested types case HandleKind.TypeReference:
if (tr.ResolutionScope.IsNil || tr.ResolutionScope.Kind == HandleKind.TypeReference) var tr = reader.GetTypeReference((TypeReferenceHandle)handle);
return false; // ignore exported and nested types
nameHandle = tr.Name; if (tr.ResolutionScope.IsNil || tr.ResolutionScope.Kind == HandleKind.TypeReference)
namespaceHandle = tr.Namespace; return false;
break; nameHandle = tr.Name;
case HandleKind.TypeDefinition: namespaceHandle = tr.Namespace;
var td = reader.GetTypeDefinition((TypeDefinitionHandle)handle); break;
if (td.IsNested) case HandleKind.TypeDefinition:
var td = reader.GetTypeDefinition((TypeDefinitionHandle)handle);
if (td.IsNested)
return false;
nameHandle = td.Name;
namespaceHandle = td.Namespace;
break;
case HandleKind.TypeSpecification:
var ts = reader.GetTypeSpecification((TypeSpecificationHandle)handle);
var blob = reader.GetBlobReader(ts.Signature);
return SignatureIsKnownType(reader, knownType, ref blob);
default:
return false; return false;
nameHandle = td.Name; }
namespaceHandle = td.Namespace; }
break; catch (BadImageFormatException)
case HandleKind.TypeSpecification: {
var ts = reader.GetTypeSpecification((TypeSpecificationHandle)handle); // ignore bad metadata when trying to resolve ResolutionScope et al.
var blob = reader.GetBlobReader(ts.Signature); return false;
return SignatureIsKnownType(reader, knownType, ref blob);
default:
return false;
} }
if (knownType.TypeParameterCount == 0) if (knownType.TypeParameterCount == 0)
{ {

Loading…
Cancel
Save