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 @@ -71,8 +71,6 @@ namespace ICSharpCode.Decompiler.Metadata
this.Handle = handle;
}
ManifestResource This() => Module.Metadata.GetManifestResource(Handle);
public bool Equals(MetadataResource other)
{
return Module == other.Module && Handle == other.Handle;
@ -90,17 +88,18 @@ namespace ICSharpCode.Decompiler.Metadata @@ -90,17 +88,18 @@ namespace ICSharpCode.Decompiler.Metadata
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 override ResourceType ResourceType => GetResourceType();
ResourceType GetResourceType()
{
if (This().Implementation.IsNil)
var resource = Module.Metadata.GetManifestResource(Handle);
if (resource.Implementation.IsNil)
return ResourceType.Embedded;
if (This().Implementation.Kind == HandleKind.AssemblyReference)
if (resource.Implementation.Kind == HandleKind.AssemblyReference)
return ResourceType.AssemblyLinked;
return ResourceType.Linked;
}
@ -117,13 +116,15 @@ namespace ICSharpCode.Decompiler.Metadata @@ -117,13 +116,15 @@ namespace ICSharpCode.Decompiler.Metadata
return null;
var sectionData = Module.Reader.GetSectionData(resources.RelativeVirtualAddress);
if (sectionData.Length == 0)
throw new BadImageFormatException("RVA could not be found in any section!");
var reader = sectionData.GetReader();
reader.Offset += (int)This().Offset;
int length = reader.ReadInt32();
if (length < 0 || length > reader.RemainingBytes)
throw new BadImageFormatException("Resource stream length invalid");
return new ResourceMemoryStream(Module.Reader, reader.CurrentPointer, length);
return null;
var resource = Module.Metadata.GetManifestResource(Handle);
if (resource.Offset > sectionData.Length)
return null;
byte* ptr = sectionData.Pointer + resource.Offset;
int length = ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24);
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 @@ -36,7 +36,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
private readonly string key;
private readonly Func<Stream> openStream;
public override object Text => this.key;
public override object Text => Language.EscapeName(key);
public override object Icon => Images.Resource;

2
ILSpy/TreeNodes/ResourceNodes/ResourceTreeNode.cs

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

Loading…
Cancel
Save