Browse Source

Fix #2759: Some characters cause rendering issues in the tree view causing ILSpy to freeze. Also ignore embedded resources with an invalid offset, treat them as having zero byte length.

pull/2769/head
Siegfried Pammer 3 years ago
parent
commit
cd1cea7d85
  1. 27
      ICSharpCode.Decompiler/Metadata/Resource.cs
  2. 2
      ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs
  3. 2
      ILSpy/TreeNodes/ResourceNodes/ResourceTreeNode.cs

27
ICSharpCode.Decompiler/Metadata/Resource.cs

@ -71,8 +71,6 @@ namespace ICSharpCode.Decompiler.Metadata
this.Handle = handle; this.Handle = handle;
} }
ManifestResource This() => Module.Metadata.GetManifestResource(Handle);
public bool Equals(MetadataResource other) public bool Equals(MetadataResource other)
{ {
return Module == other.Module && Handle == other.Handle; return Module == other.Module && Handle == other.Handle;
@ -90,17 +88,18 @@ namespace ICSharpCode.Decompiler.Metadata
return unchecked(982451629 * Module.GetHashCode() + 982451653 * MetadataTokens.GetToken(Handle)); return unchecked(982451629 * Module.GetHashCode() + 982451653 * MetadataTokens.GetToken(Handle));
} }
public override string Name => Module.Metadata.GetString(This().Name); public override string Name => Module.Metadata.GetString(Module.Metadata.GetManifestResource(Handle).Name);
public override ManifestResourceAttributes Attributes => This().Attributes; public override ManifestResourceAttributes Attributes => Module.Metadata.GetManifestResource(Handle).Attributes;
public bool HasFlag(ManifestResourceAttributes flag) => (Attributes & flag) == flag; public bool HasFlag(ManifestResourceAttributes flag) => (Attributes & flag) == flag;
public override ResourceType ResourceType => GetResourceType(); public override ResourceType ResourceType => GetResourceType();
ResourceType GetResourceType() ResourceType GetResourceType()
{ {
if (This().Implementation.IsNil) var resource = Module.Metadata.GetManifestResource(Handle);
if (resource.Implementation.IsNil)
return ResourceType.Embedded; return ResourceType.Embedded;
if (This().Implementation.Kind == HandleKind.AssemblyReference) if (resource.Implementation.Kind == HandleKind.AssemblyReference)
return ResourceType.AssemblyLinked; return ResourceType.AssemblyLinked;
return ResourceType.Linked; return ResourceType.Linked;
} }
@ -117,13 +116,15 @@ namespace ICSharpCode.Decompiler.Metadata
return null; return null;
var sectionData = Module.Reader.GetSectionData(resources.RelativeVirtualAddress); var sectionData = Module.Reader.GetSectionData(resources.RelativeVirtualAddress);
if (sectionData.Length == 0) if (sectionData.Length == 0)
throw new BadImageFormatException("RVA could not be found in any section!"); return null;
var reader = sectionData.GetReader(); var resource = Module.Metadata.GetManifestResource(Handle);
reader.Offset += (int)This().Offset; if (resource.Offset > sectionData.Length)
int length = reader.ReadInt32(); return null;
if (length < 0 || length > reader.RemainingBytes) byte* ptr = sectionData.Pointer + resource.Offset;
throw new BadImageFormatException("Resource stream length invalid"); int length = ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24);
return new ResourceMemoryStream(Module.Reader, reader.CurrentPointer, length); if (length < 0 || length > sectionData.Length)
return null;
return new ResourceMemoryStream(Module.Reader, ptr + sizeof(int), length);
} }
} }

2
ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs

@ -36,7 +36,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
private readonly string key; private readonly string key;
private readonly Func<Stream> openStream; private readonly Func<Stream> openStream;
public override object Text => this.key; public override object Text => Language.EscapeName(key);
public override object Icon => Images.Resource; public override object Icon => Images.Resource;

2
ILSpy/TreeNodes/ResourceNodes/ResourceTreeNode.cs

@ -51,7 +51,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public Resource Resource { get; } public Resource Resource { get; }
public override object Text => Resource.Name; public override object Text => Language.EscapeName(Resource.Name);
public override object Icon => Images.Resource; public override object Icon => Images.Resource;

Loading…
Cancel
Save