From a27fbb9c91be8450e5a347ebd1951cab03ff196e Mon Sep 17 00:00:00 2001 From: pedrobsaila Date: Sun, 31 Mar 2024 22:50:29 +0200 Subject: [PATCH] PEReader throws exception when using PEStreamOptions.PrefetchMetadata for some assemblies --- .../System/Reflection/PortableExecutable/PEReader.cs | 6 +++++- .../tests/PortableExecutable/PEReaderTests.cs | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Reflection.Metadata/src/System/Reflection/PortableExecutable/PEReader.cs b/src/libraries/System.Reflection.Metadata/src/System/Reflection/PortableExecutable/PEReader.cs index 6b179a54c1cc09..37533d8c3c7c3d 100644 --- a/src/libraries/System.Reflection.Metadata/src/System/Reflection/PortableExecutable/PEReader.cs +++ b/src/libraries/System.Reflection.Metadata/src/System/Reflection/PortableExecutable/PEReader.cs @@ -201,7 +201,11 @@ public unsafe PEReader(Stream peStream, PEStreamOptions options, int size) { // The peImage is left null, but the lazyMetadataBlock is initialized up front. _lazyPEHeaders = new PEHeaders(peStream, actualSize, IsLoadedImage); - _lazyMetadataBlock = StreamMemoryBlockProvider.ReadMemoryBlockNoLock(peStream, _lazyPEHeaders.MetadataStartOffset, _lazyPEHeaders.MetadataSize); + + if (_lazyPEHeaders.MetadataStartOffset != -1) + { + _lazyMetadataBlock = StreamMemoryBlockProvider.ReadMemoryBlockNoLock(peStream, _lazyPEHeaders.MetadataStartOffset, _lazyPEHeaders.MetadataSize); + } } // We read all we need, the stream is going to be closed. } diff --git a/src/libraries/System.Reflection.Metadata/tests/PortableExecutable/PEReaderTests.cs b/src/libraries/System.Reflection.Metadata/tests/PortableExecutable/PEReaderTests.cs index 20477b5a44b928..80312c66a44241 100644 --- a/src/libraries/System.Reflection.Metadata/tests/PortableExecutable/PEReaderTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/PortableExecutable/PEReaderTests.cs @@ -870,5 +870,15 @@ public unsafe void InvokeCtorWithIsLoadedImageAndPrefetchMetadataOptions2() } } } + + [Fact] + public void HasMetadataShouldReturnFalseWhenPrefetchingMetadataOfImageWithoutMetadata() + { + using (var fileStream = new MemoryStream(Misc.KeyPair)) + using (var peReader = new PEReader(fileStream, PEStreamOptions.PrefetchMetadata | PEStreamOptions.LeaveOpen)) + { + Assert.False(peReader.HasMetadata); + } + } } }