Fix PEReader creation and caching (#1742)

Can't use a fixed stack-based pointer to initialize something on the heap and expect it to continue working :)
This commit is contained in:
Fadi Hanna 2020-01-15 10:37:01 -05:00 committed by Jan Kotas
parent 27b1f2c81b
commit eb8244be5e
1 changed files with 10 additions and 13 deletions

View File

@ -2,18 +2,19 @@
// The .NET Foundation licenses this file to you under the MIT license. // The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using ILCompiler.Reflection.ReadyToRun;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.CommandLine; using System.Collections.Immutable;
using System.CommandLine.Invocation; using System.CommandLine.Invocation;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335; using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable; using System.Reflection.PortableExecutable;
using System.Runtime.CompilerServices;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using ILCompiler.Reflection.ReadyToRun;
namespace R2RDump namespace R2RDump
{ {
@ -90,20 +91,16 @@ namespace R2RDump
private static unsafe MetadataReader Open(string filename) private static unsafe MetadataReader Open(string filename)
{ {
byte[] Image = File.ReadAllBytes(filename); byte[] image = File.ReadAllBytes(filename);
fixed (byte* p = Image) PEReader peReader = new PEReader(Unsafe.As<byte[], ImmutableArray<byte>>(ref image));
if (!peReader.HasMetadata)
{ {
IntPtr ptr = (IntPtr)p; throw new Exception($"ECMA metadata not found in file '{filename}'");
PEReader peReader = new PEReader(p, Image.Length);
if (!peReader.HasMetadata)
{
throw new Exception($"ECMA metadata not found in file '{filename}'");
}
return peReader.GetMetadataReader();
} }
return peReader.GetMetadataReader();
} }
} }