diff --git a/ICSharpCode.Decompiler/Metadata/Resource.cs b/ICSharpCode.Decompiler/Metadata/Resource.cs index dab589928..4d5925918 100644 --- a/ICSharpCode.Decompiler/Metadata/Resource.cs +++ b/ICSharpCode.Decompiler/Metadata/Resource.cs @@ -110,48 +110,39 @@ namespace ICSharpCode.Decompiler.Metadata return ResourceType.Linked; } - public override unsafe Stream? TryOpenStream() + unsafe bool TryReadResource(out byte* ptr, out long length) { + ptr = null; + length = 0; if (ResourceType != ResourceType.Embedded) - return null; + return false; var headers = Module.Reader.PEHeaders; if (headers.CorHeader == null) - return null; + return false; var resources = headers.CorHeader.ResourcesDirectory; if (resources.RelativeVirtualAddress == 0) - return null; + return false; var sectionData = Module.Reader.GetSectionData(resources.RelativeVirtualAddress); if (sectionData.Length == 0) - return null; + return false; 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) + if (resource.Offset + 4 > sectionData.Length) + return false; + ptr = sectionData.Pointer + resource.Offset; + length = ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24); + return length >= 0 && length <= sectionData.Length; + } + + public override unsafe Stream? TryOpenStream() + { + if (!TryReadResource(out var ptr, out var length)) return null; return new ResourceMemoryStream(Module.Reader, ptr + sizeof(int), length); } public unsafe override long? TryGetLength() { - if (ResourceType != ResourceType.Embedded) - return null; - var headers = Module.Reader.PEHeaders; - if (headers.CorHeader == null) - return null; - var resources = headers.CorHeader.ResourcesDirectory; - if (resources.RelativeVirtualAddress == 0) - return null; - var sectionData = Module.Reader.GetSectionData(resources.RelativeVirtualAddress); - if (sectionData.Length == 0) - 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) + if (!TryReadResource(out _, out var length)) return null; return length; }