Skip to content

Commit 0895665

Browse files
pedrobsailamatouskozak
authored andcommitted
PEReader throws exception when using PEStreamOptions.PrefetchMetadata for some assemblies (dotnet#100472)
1 parent 7932f01 commit 0895665

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/libraries/System.Reflection.Metadata/src/System/Reflection/PortableExecutable/PEReader.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,11 @@ public unsafe PEReader(Stream peStream, PEStreamOptions options, int size)
201201
{
202202
// The peImage is left null, but the lazyMetadataBlock is initialized up front.
203203
_lazyPEHeaders = new PEHeaders(peStream, actualSize, IsLoadedImage);
204-
_lazyMetadataBlock = StreamMemoryBlockProvider.ReadMemoryBlockNoLock(peStream, _lazyPEHeaders.MetadataStartOffset, _lazyPEHeaders.MetadataSize);
204+
205+
if (_lazyPEHeaders.MetadataStartOffset != -1)
206+
{
207+
_lazyMetadataBlock = StreamMemoryBlockProvider.ReadMemoryBlockNoLock(peStream, _lazyPEHeaders.MetadataStartOffset, _lazyPEHeaders.MetadataSize);
208+
}
205209
}
206210
// We read all we need, the stream is going to be closed.
207211
}

src/libraries/System.Reflection.Metadata/tests/PortableExecutable/PEReaderTests.cs

+10
Original file line numberDiff line numberDiff line change
@@ -870,5 +870,15 @@ public unsafe void InvokeCtorWithIsLoadedImageAndPrefetchMetadataOptions2()
870870
}
871871
}
872872
}
873+
874+
[Fact]
875+
public void HasMetadataShouldReturnFalseWhenPrefetchingMetadataOfImageWithoutMetadata()
876+
{
877+
using (var fileStream = new MemoryStream(Misc.KeyPair))
878+
using (var peReader = new PEReader(fileStream, PEStreamOptions.PrefetchMetadata | PEStreamOptions.LeaveOpen))
879+
{
880+
Assert.False(peReader.HasMetadata);
881+
}
882+
}
873883
}
874884
}

0 commit comments

Comments
 (0)