diff --git a/src/installer/managed/Microsoft.NET.HostModel/ResourceUpdater.cs b/src/installer/managed/Microsoft.NET.HostModel/ResourceUpdater.cs index e4791a6bb14e99..1873e38956038e 100644 --- a/src/installer/managed/Microsoft.NET.HostModel/ResourceUpdater.cs +++ b/src/installer/managed/Microsoft.NET.HostModel/ResourceUpdater.cs @@ -13,7 +13,7 @@ namespace Microsoft.NET.HostModel /// /// Provides methods for modifying the embedded native resources in a PE image. /// - public class ResourceUpdater : IDisposable + public sealed class ResourceUpdater : IDisposable { private readonly FileStream stream; private readonly PEReader _reader; @@ -331,12 +331,15 @@ public void Dispose() GC.SuppressFinalize(this); } - public void Dispose(bool disposing) + private void Dispose(bool disposing) { - if (disposing && !leaveOpen) + if (disposing) { _reader.Dispose(); - stream.Dispose(); + if (!leaveOpen) + { + stream.Dispose(); + } } } } diff --git a/src/installer/tests/Microsoft.NET.HostModel.Tests/ResourceUpdaterTests.cs b/src/installer/tests/Microsoft.NET.HostModel.Tests/ResourceUpdaterTests.cs index 30e3efdf1027db..2f25839507bbfa 100644 --- a/src/installer/tests/Microsoft.NET.HostModel.Tests/ResourceUpdaterTests.cs +++ b/src/installer/tests/Microsoft.NET.HostModel.Tests/ResourceUpdaterTests.cs @@ -23,7 +23,7 @@ class TempFile : IDisposable public TempFile() { _path = Path.GetTempFileName(); - Stream = new FileStream(_path, FileMode.Open); + Stream = new FileStream(_path, FileMode.Open, FileAccess.ReadWrite, FileShare.None); } public void Dispose() @@ -169,6 +169,25 @@ void AddResource_AddTwoSameUShortTypeWithDifferName() } } + [Fact] + void DisposeWithLeaveOpenDisposesPEReader() + { + using var tempFile = GetCurrentAssemblyMemoryStream(); + PEReader? peReader = null; + + using (var updater = new ResourceUpdater(tempFile.Stream, leaveOpen: true)) + { + FieldInfo? readerField = typeof(ResourceUpdater).GetField("_reader", BindingFlags.Instance | BindingFlags.NonPublic); + Assert.NotNull(readerField); + peReader = Assert.IsType(readerField.GetValue(updater)); + _ = peReader.PEHeaders; + } + + Assert.NotNull(peReader); + + Assert.Throws(() => _ = peReader!.PEHeaders); + } + [Fact] void AddResourcesFromPEImage() {