From cd1cea7d85f34f04c19aa7760675335eaaa1b94e Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 25 Aug 2022 21:42:29 +0200 Subject: [PATCH] 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. --- ICSharpCode.Decompiler/Metadata/Resource.cs | 27 ++++++++++--------- .../ResourceNodes/ResourceEntryNode.cs | 2 +- .../ResourceNodes/ResourceTreeNode.cs | 2 +- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/ICSharpCode.Decompiler/Metadata/Resource.cs b/ICSharpCode.Decompiler/Metadata/Resource.cs index 9eec0959e..db603f508 100644 --- a/ICSharpCode.Decompiler/Metadata/Resource.cs +++ b/ICSharpCode.Decompiler/Metadata/Resource.cs @@ -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 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 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); } } diff --git a/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs b/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs index a130b2027..5786c88c8 100644 --- a/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs +++ b/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs @@ -36,7 +36,7 @@ namespace ICSharpCode.ILSpy.TreeNodes private readonly string key; private readonly Func openStream; - public override object Text => this.key; + public override object Text => Language.EscapeName(key); public override object Icon => Images.Resource; diff --git a/ILSpy/TreeNodes/ResourceNodes/ResourceTreeNode.cs b/ILSpy/TreeNodes/ResourceNodes/ResourceTreeNode.cs index c0a797a86..d09a0de1b 100644 --- a/ILSpy/TreeNodes/ResourceNodes/ResourceTreeNode.cs +++ b/ILSpy/TreeNodes/ResourceNodes/ResourceTreeNode.cs @@ -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;