From f596cffd5ef56492ab72131bb8ae768ce5a33d2c Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Wed, 12 Jul 2023 23:05:43 -0500 Subject: [PATCH 01/14] ntlm --- .../Common/tests/System/Net/Security/FakeNtlmServer.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs b/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs index 2561be492d402a..0e4da6ca338555 100644 --- a/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs +++ b/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs @@ -396,6 +396,12 @@ private void ValidateAuthentication(byte[] incomingBlob) public void ResetKeys() { + if (_clientSeal != null) + _clientSeal.Dispose(); + + if (_serverSeal != null) + _serverSeal.Dispose(); + _clientSeal = new RC4(_clientSealingKey); _serverSeal = new RC4(_serverSealingKey); } From 461110c01ffb50da41c8132b62d964c5475ebfaa Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Wed, 12 Jul 2023 23:05:52 -0500 Subject: [PATCH 02/14] test base --- .../tests/TestUtilities/System/IO/FileCleanupTestBase.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libraries/Common/tests/TestUtilities/System/IO/FileCleanupTestBase.cs b/src/libraries/Common/tests/TestUtilities/System/IO/FileCleanupTestBase.cs index 0629483be0730f..784aec4f151947 100644 --- a/src/libraries/Common/tests/TestUtilities/System/IO/FileCleanupTestBase.cs +++ b/src/libraries/Common/tests/TestUtilities/System/IO/FileCleanupTestBase.cs @@ -208,10 +208,14 @@ private unsafe string GetTestDirectoryActualCasing() // Remove extended prefix int skip = PathInternal.IsExtended(buffer) ? 4 : 0; - return new string( + string str = new string( buffer, skip, (int)result - skip); + + ArrayPool.Shared.Return(buffer); + + return str; } } catch { } From b37f4db854b9321ab95d79e625ec665f2982ead9 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Wed, 12 Jul 2023 23:06:00 -0500 Subject: [PATCH 03/14] qpack --- .../System/Net/aspnetcore/Http3/QPackDecoderTest.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/libraries/Common/tests/Tests/System/Net/aspnetcore/Http3/QPackDecoderTest.cs b/src/libraries/Common/tests/Tests/System/Net/aspnetcore/Http3/QPackDecoderTest.cs index 931ecbcd9bd2ed..643bfdd868c06f 100644 --- a/src/libraries/Common/tests/Tests/System/Net/aspnetcore/Http3/QPackDecoderTest.cs +++ b/src/libraries/Common/tests/Tests/System/Net/aspnetcore/Http3/QPackDecoderTest.cs @@ -15,7 +15,7 @@ namespace System.Net.Http.Unit.Tests.QPack { - public class QPackDecoderTests + public class QPackDecoderTests : IDisposable { private const int MaxHeaderFieldSize = 8192; @@ -64,6 +64,11 @@ public QPackDecoderTests() _decoder = new QPackDecoder(MaxHeaderFieldSize); } + public void Dispose() + { + _decoder.Dispose(); + } + [Fact] public void DecodesIndexedHeaderField_StaticTableWithValue() { @@ -318,7 +323,7 @@ private static void TestDecodeWithoutIndexing(byte[] encoded, KeyValuePair[] expectedValues, bool expectDynamicTableEntry, int? bytesAtATime) { - QPackDecoder decoder = new QPackDecoder(MaxHeaderFieldSize); + using QPackDecoder decoder = new QPackDecoder(MaxHeaderFieldSize); TestHttpHeadersHandler handler = new TestHttpHeadersHandler(); // Read past header From 32f01cdf10e14aabb8bd5ce73ca808da752d134f Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Wed, 12 Jul 2023 23:06:11 -0500 Subject: [PATCH 04/14] FileSys --- .../src/System/IO/Enumeration/FileSystemName.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/IO/Enumeration/FileSystemName.cs b/src/libraries/System.Private.CoreLib/src/System/IO/Enumeration/FileSystemName.cs index fa95554cbc49c5..0de76f25649322 100644 --- a/src/libraries/System.Private.CoreLib/src/System/IO/Enumeration/FileSystemName.cs +++ b/src/libraries/System.Private.CoreLib/src/System/IO/Enumeration/FileSystemName.cs @@ -51,7 +51,13 @@ public static string TranslateWin32Expression(string? expression) } } - return modified ? sb.ToString() : expression; + if (!modified) + { + sb.Dispose(); + return expression; + } + + return sb.ToString(); } /// Verifies whether the given Win32 expression matches the given name. Supports the following wildcards: '*', '?', '<', '>', '"'. The backslash character '\' escapes. From 29aabf6caae19cdd5c4bc6f3ac1a15b8353a98cf Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Wed, 12 Jul 2023 23:06:24 -0500 Subject: [PATCH 05/14] JSON --- .../RealWorldContextTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/RealWorldContextTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/RealWorldContextTests.cs index 420df16908981c..201e94ed252a0f 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/RealWorldContextTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/RealWorldContextTests.cs @@ -118,12 +118,12 @@ public virtual void RoundTripTypeNameClash() [InlineData("{ \"key\" : \"value\" }")] public void RoundtripJsonDocument(string json) { - JsonDocument jsonDocument = JsonDocument.Parse(json); + using JsonDocument jsonDocument = JsonDocument.Parse(json); string actualJson = JsonSerializer.Serialize(jsonDocument, DefaultContext.JsonDocument); JsonTestHelper.AssertJsonEqual(json, actualJson); - JsonDocument actualJsonDocument = JsonSerializer.Deserialize(actualJson, DefaultContext.JsonDocument); + using JsonDocument actualJsonDocument = JsonSerializer.Deserialize(actualJson, DefaultContext.JsonDocument); JsonTestHelper.AssertJsonEqual(jsonDocument.RootElement, actualJsonDocument.RootElement); } From b15651e8b794c93e43516d2698012210f3b0f722 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Wed, 12 Jul 2023 23:06:36 -0500 Subject: [PATCH 06/14] interp tests --- .../DefaultInterpolatedStringHandlerTests.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/libraries/System.Runtime/tests/System/Runtime/CompilerServices/DefaultInterpolatedStringHandlerTests.cs b/src/libraries/System.Runtime/tests/System/Runtime/CompilerServices/DefaultInterpolatedStringHandlerTests.cs index 11740f8f00d938..80f30c2e213a34 100644 --- a/src/libraries/System.Runtime/tests/System/Runtime/CompilerServices/DefaultInterpolatedStringHandlerTests.cs +++ b/src/libraries/System.Runtime/tests/System/Runtime/CompilerServices/DefaultInterpolatedStringHandlerTests.cs @@ -18,17 +18,17 @@ public class DefaultInterpolatedStringHandlerTests [InlineData(-16, 1)] public void LengthAndHoleArguments_Valid(int literalLength, int formattedCount) { - new DefaultInterpolatedStringHandler(literalLength, formattedCount); + new DefaultInterpolatedStringHandler(literalLength, formattedCount).ToStringAndClear(); Span scratch1 = stackalloc char[1]; foreach (IFormatProvider provider in new IFormatProvider[] { null, new ConcatFormatter(), CultureInfo.InvariantCulture, CultureInfo.CurrentCulture, new CultureInfo("en-US"), new CultureInfo("fr-FR") }) { - new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider); + new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider).ToStringAndClear(); - new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, default); - new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, scratch1); - new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, Array.Empty()); - new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, new char[256]); + new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, default).ToStringAndClear(); + new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, scratch1).ToStringAndClear(); + new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, Array.Empty()).ToStringAndClear(); + new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, new char[256]).ToStringAndClear(); } } @@ -244,6 +244,8 @@ public void AppendFormatted_ReferenceTypes_CreateProviderFlowed(bool useScratch) handler.AppendFormatted(tss, 1, "X2"); Assert.Same(provider, tss.ToStringState.LastProvider); } + + handler.ToStringAndClear(); } [Fact] @@ -357,6 +359,8 @@ void Test(T t) handler.AppendFormatted(t, 1, "X2"); Assert.Same(provider, ((IHasToStringState)t).ToStringState.LastProvider); + + handler.ToStringAndClear(); } Test(new FormattableInt32Wrapper(42)); From 2b71bc7b5770b368806280c05a1c09c92adff6d9 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Thu, 13 Jul 2023 13:42:44 -0500 Subject: [PATCH 07/14] fix NTAuthentication leak --- .../src/System/Net/NTAuthentication.Managed.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libraries/System.Net.Security/src/System/Net/NTAuthentication.Managed.cs b/src/libraries/System.Net.Security/src/System/Net/NTAuthentication.Managed.cs index 4ba654d0ea6edc..50bc6573190979 100644 --- a/src/libraries/System.Net.Security/src/System/Net/NTAuthentication.Managed.cs +++ b/src/libraries/System.Net.Security/src/System/Net/NTAuthentication.Managed.cs @@ -773,6 +773,10 @@ private static byte[] DeriveKey(ReadOnlySpan exportedSessionKey, ReadOnlyS private void ResetKeys() { + // Release buffers to pool + _clientSeal?.Dispose(); + _serverSeal?.Dispose(); + _clientSeal = new RC4(_clientSealingKey); _serverSeal = new RC4(_serverSealingKey); } From 80f5d6863716562931300c82a9a69b967ad76f86 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Thu, 13 Jul 2023 13:43:00 -0500 Subject: [PATCH 08/14] More in JSON --- .../RealWorldContextTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/RealWorldContextTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/RealWorldContextTests.cs index 201e94ed252a0f..948dcfea708d5b 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/RealWorldContextTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/RealWorldContextTests.cs @@ -135,7 +135,8 @@ public void RoundtripJsonDocument(string json) [InlineData("{ \"key\" : \"value\" }")] public void RoundtripJsonElement(string json) { - JsonElement jsonElement = JsonDocument.Parse(json).RootElement; + using JsonDocument jsonDocument = JsonDocument.Parse(json); + JsonElement jsonElement = jsonDocument.RootElement; string actualJson = JsonSerializer.Serialize(jsonElement, DefaultContext.JsonElement); JsonTestHelper.AssertJsonEqual(json, actualJson); From dfb835aa1b73e8872169cf7f97f4914a59170089 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Thu, 13 Jul 2023 18:14:53 -0500 Subject: [PATCH 09/14] more tests --- .../Tests/System/Net/MultiArrayBufferTests.cs | 18 +++++++++--------- .../System/Text/ValueStringBuilderTests.cs | 1 + .../tests/MemoryPool/MemoryPool.cs | 10 +++++----- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/libraries/Common/tests/Tests/System/Net/MultiArrayBufferTests.cs b/src/libraries/Common/tests/Tests/System/Net/MultiArrayBufferTests.cs index 1459e9ce26bcbb..3ea1ae49149f3e 100644 --- a/src/libraries/Common/tests/Tests/System/Net/MultiArrayBufferTests.cs +++ b/src/libraries/Common/tests/Tests/System/Net/MultiArrayBufferTests.cs @@ -16,7 +16,7 @@ public sealed class MultiArrayBufferTests [Fact] public void BasicTest() { - MultiArrayBuffer buffer = new MultiArrayBuffer(0); + using MultiArrayBuffer buffer = new MultiArrayBuffer(0); Assert.True(buffer.IsEmpty); Assert.True(buffer.ActiveMemory.IsEmpty); @@ -98,7 +98,7 @@ public void AddByteByByteAndConsumeByteByByte_Success() { const int Size = 64 * 1024 + 1; - MultiArrayBuffer buffer = new MultiArrayBuffer(0); + using MultiArrayBuffer buffer = new MultiArrayBuffer(0); for (int i = 0; i < Size; i++) { @@ -124,7 +124,7 @@ public void AddSeveralBytesRepeatedlyAndConsumeSeveralBytesRepeatedly_Success() const int ByteCount = 7; const int RepeatCount = 8 * 1024; // enough to ensure we cross several block boundaries - MultiArrayBuffer buffer = new MultiArrayBuffer(0); + using MultiArrayBuffer buffer = new MultiArrayBuffer(0); for (int i = 0; i < RepeatCount; i++) { @@ -156,7 +156,7 @@ public void AddSeveralBytesRepeatedlyAndConsumeSeveralBytesRepeatedly_UsingSlice const int ByteCount = 7; const int RepeatCount = 8 * 1024; // enough to ensure we cross several block boundaries - MultiArrayBuffer buffer = new MultiArrayBuffer(0); + using MultiArrayBuffer buffer = new MultiArrayBuffer(0); for (int i = 0; i < RepeatCount; i++) { @@ -188,7 +188,7 @@ public void AddSeveralBytesRepeatedlyAndConsumeSeveralBytesRepeatedly_UsingSlice const int ByteCount = 7; const int RepeatCount = 8 * 1024; // enough to ensure we cross several block boundaries - MultiArrayBuffer buffer = new MultiArrayBuffer(0); + using MultiArrayBuffer buffer = new MultiArrayBuffer(0); for (int i = 0; i < RepeatCount; i++) { @@ -221,7 +221,7 @@ public void CopyFromRepeatedlyAndCopyToRepeatedly_Success() const int RepeatCount = 8 * 1024; // enough to ensure we cross several block boundaries - MultiArrayBuffer buffer = new MultiArrayBuffer(0); + using MultiArrayBuffer buffer = new MultiArrayBuffer(0); for (int i = 0; i < RepeatCount; i++) { @@ -250,7 +250,7 @@ public void CopyFromRepeatedlyAndCopyToRepeatedly_LargeCopies_Success() const int RepeatCount = 13; - MultiArrayBuffer buffer = new MultiArrayBuffer(0); + using MultiArrayBuffer buffer = new MultiArrayBuffer(0); for (int i = 0; i < RepeatCount; i++) { @@ -291,7 +291,7 @@ public void EmptyMultiMemoryTest() [Fact] public void EnsureAvailableSpaceTest() { - MultiArrayBuffer buffer = new MultiArrayBuffer(0); + using MultiArrayBuffer buffer = new MultiArrayBuffer(0); Assert.Equal(0, buffer.ActiveMemory.Length); Assert.Equal(0, buffer.AvailableMemory.Length); @@ -423,7 +423,7 @@ public void EnsureAvailableSpaceTest() [Fact] public void EnsureAvailableSpaceUpToLimitTest() { - MultiArrayBuffer buffer = new MultiArrayBuffer(0); + using MultiArrayBuffer buffer = new MultiArrayBuffer(0); Assert.Equal(0, buffer.ActiveMemory.Length); Assert.Equal(0, buffer.AvailableMemory.Length); diff --git a/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs b/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs index 20d65e5ba88c7c..d5b0befe923269 100644 --- a/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs +++ b/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs @@ -180,6 +180,7 @@ public void AsSpan_ReturnsCorrectValue_DoesntClearBuilder() Assert.NotEqual(0, sb.Length); Assert.Equal(sb.Length, vsb.Length); + Assert.Equal(sb.ToString(), vsb.ToString()); } [Fact] diff --git a/src/libraries/System.Memory/tests/MemoryPool/MemoryPool.cs b/src/libraries/System.Memory/tests/MemoryPool/MemoryPool.cs index 25c28223481d9c..88eec631069619 100644 --- a/src/libraries/System.Memory/tests/MemoryPool/MemoryPool.cs +++ b/src/libraries/System.Memory/tests/MemoryPool/MemoryPool.cs @@ -90,7 +90,7 @@ public static void MemoryPoolPin(int elementIndex) public static void MemoryPoolPinBadOffset(int elementIndex) { MemoryPool pool = MemoryPool.Shared; - IMemoryOwner block = pool.Rent(10); + using IMemoryOwner block = pool.Rent(10); Memory memory = block.Memory; Span sp = memory.Span; Assert.Equal(memory.Length, sp.Length); @@ -101,7 +101,7 @@ public static void MemoryPoolPinBadOffset(int elementIndex) public static void MemoryPoolPinOffsetAtEnd() { MemoryPool pool = MemoryPool.Shared; - IMemoryOwner block = pool.Rent(10); + using IMemoryOwner block = pool.Rent(10); Memory memory = block.Memory; Span sp = memory.Span; Assert.Equal(memory.Length, sp.Length); @@ -122,7 +122,7 @@ public static void MemoryPoolPinOffsetAtEnd() public static void MemoryPoolPinBadOffsetTooLarge() { MemoryPool pool = MemoryPool.Shared; - IMemoryOwner block = pool.Rent(10); + using IMemoryOwner block = pool.Rent(10); Memory memory = block.Memory; Span sp = memory.Span; Assert.Equal(memory.Length, sp.Length); @@ -231,7 +231,7 @@ public static void MemoryPoolTryGetArray() [Fact] public static void ExtraDisposesAreIgnored() { - IMemoryOwner block = MemoryPool.Shared.Rent(42); + using IMemoryOwner block = MemoryPool.Shared.Rent(42); block.Dispose(); block.Dispose(); } @@ -239,7 +239,7 @@ public static void ExtraDisposesAreIgnored() [Fact] public static void NoMemoryAfterDispose() { - IMemoryOwner block = MemoryPool.Shared.Rent(42); + using IMemoryOwner block = MemoryPool.Shared.Rent(42); block.Dispose(); Assert.Throws(() => block.Memory); } From f6ca760075555ba5dbbf0b6e187d0e30458a6e8e Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Thu, 13 Jul 2023 14:08:32 -0500 Subject: [PATCH 10/14] ntlmserver disposable --- .../tests/System/Net/Security/FakeNtlmServer.cs | 10 +++++++++- .../tests/FunctionalTests/NtAuthTests.FakeServer.cs | 2 ++ .../tests/Functional/LoopbackSmtpServer.cs | 2 +- .../tests/UnitTests/NegotiateAuthenticationTests.cs | 12 ++++++------ 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs b/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs index 0e4da6ca338555..8e3ea90bc17305 100644 --- a/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs +++ b/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs @@ -24,7 +24,7 @@ namespace System.Net.Security // and responses for unit test purposes. The validation checks the // structure of the messages, their integrity and use of specified // features (eg. MIC). - internal class FakeNtlmServer + internal class FakeNtlmServer : IDisposable { public FakeNtlmServer(NetworkCredential expectedCredential) { @@ -142,6 +142,14 @@ private enum AvFlags : uint UntrustedSPN = 4, } + public void Dispose() + { + _clientSeal?.Dispose(); + _clientSeal = null; + _serverSeal?.Dispose(); + _serverSeal = null; + } + private static ReadOnlySpan GetField(ReadOnlySpan payload, int fieldOffset) { uint offset = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(fieldOffset + 4)); diff --git a/src/libraries/System.Net.Http/tests/FunctionalTests/NtAuthTests.FakeServer.cs b/src/libraries/System.Net.Http/tests/FunctionalTests/NtAuthTests.FakeServer.cs index 881555d67ffad9..5ec6a53015cb27 100644 --- a/src/libraries/System.Net.Http/tests/FunctionalTests/NtAuthTests.FakeServer.cs +++ b/src/libraries/System.Net.Http/tests/FunctionalTests/NtAuthTests.FakeServer.cs @@ -107,6 +107,8 @@ internal static async Task HandleAuthenticationRequestWithFakeServer(LoopbackSer } while (!isAuthenticated); + fakeNtlmServer?.Dispose(); + await connection.SendResponseAsync(HttpStatusCode.OK); } diff --git a/src/libraries/System.Net.Mail/tests/Functional/LoopbackSmtpServer.cs b/src/libraries/System.Net.Mail/tests/Functional/LoopbackSmtpServer.cs index 72d26da2486c98..6b5d4ab504488e 100644 --- a/src/libraries/System.Net.Mail/tests/Functional/LoopbackSmtpServer.cs +++ b/src/libraries/System.Net.Mail/tests/Functional/LoopbackSmtpServer.cs @@ -156,7 +156,7 @@ await SendMessageAsync( else if (parts[1].Equals("GSSAPI", StringComparison.OrdinalIgnoreCase)) { Debug.Assert(ExpectedGssapiCredential != null); - FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(ExpectedGssapiCredential) { ForceNegotiateVersion = true }; + using FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(ExpectedGssapiCredential) { ForceNegotiateVersion = true }; FakeNegotiateServer fakeNegotiateServer = new FakeNegotiateServer(fakeNtlmServer); try diff --git a/src/libraries/System.Net.Security/tests/UnitTests/NegotiateAuthenticationTests.cs b/src/libraries/System.Net.Security/tests/UnitTests/NegotiateAuthenticationTests.cs index eb2b3c42b607f6..ee909c5b091072 100644 --- a/src/libraries/System.Net.Security/tests/UnitTests/NegotiateAuthenticationTests.cs +++ b/src/libraries/System.Net.Security/tests/UnitTests/NegotiateAuthenticationTests.cs @@ -41,7 +41,7 @@ public void RemoteIdentity_ThrowsOnUnauthenticated() [ConditionalFact(nameof(IsNtlmAvailable))] public void RemoteIdentity_ThrowsOnDisposed() { - FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight); + using FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight); NegotiateAuthentication negotiateAuthentication = new NegotiateAuthentication( new NegotiateAuthenticationClientOptions { @@ -98,7 +98,7 @@ public void NtlmProtocolExampleTest() { // Mirrors the NTLMv2 example in the NTLM specification: NetworkCredential credential = new NetworkCredential("User", "Password", "Domain"); - FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(credential); + using FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(credential); fakeNtlmServer.SendTimestamp = false; fakeNtlmServer.TargetIsServer = true; fakeNtlmServer.PreferUnicode = false; @@ -151,7 +151,7 @@ public void NtlmProtocolExampleTest() [ConditionalFact(nameof(IsNtlmAvailable))] public void NtlmCorrectExchangeTest() { - FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight); + using FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight); NegotiateAuthentication ntAuth = new NegotiateAuthentication( new NegotiateAuthenticationClientOptions { @@ -175,7 +175,7 @@ public void NtlmCorrectExchangeTest() [ConditionalFact(nameof(IsNtlmAvailable))] public void NtlmIncorrectExchangeTest() { - FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight); + using FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight); NegotiateAuthentication ntAuth = new NegotiateAuthentication( new NegotiateAuthenticationClientOptions { @@ -194,7 +194,7 @@ public void NtlmIncorrectExchangeTest() [ActiveIssue("https://github.com/dotnet/runtime/issues/65678", TestPlatforms.OSX | TestPlatforms.iOS | TestPlatforms.MacCatalyst)] public void NtlmSignatureTest() { - FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight); + using FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight); NegotiateAuthentication ntAuth = new NegotiateAuthentication( new NegotiateAuthenticationClientOptions { @@ -250,7 +250,7 @@ private void DoNtlmExchange(FakeNtlmServer fakeNtlmServer, NegotiateAuthenticati public void NegotiateCorrectExchangeTest(bool requestMIC, bool requestConfidentiality) { // Older versions of gss-ntlmssp on Linux generate MIC at incorrect offset unless ForceNegotiateVersion is specified - FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight) { ForceNegotiateVersion = true }; + using FakeNtlmServer fakeNtlmServer = new FakeNtlmServer(s_testCredentialRight) { ForceNegotiateVersion = true }; FakeNegotiateServer fakeNegotiateServer = new FakeNegotiateServer(fakeNtlmServer) { RequestMIC = requestMIC }; NegotiateAuthentication ntAuth = new NegotiateAuthentication( new NegotiateAuthenticationClientOptions From b817c34ed2b4f32d9d9ffc3951c8adc669f30c1c Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Thu, 13 Jul 2023 14:45:16 -0500 Subject: [PATCH 11/14] more tests --- .../Common/tests/Tests/System/Text/ValueStringBuilderTests.cs | 3 +++ .../System.Security.Cryptography/tests/ZeroMemoryTests.cs | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs b/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs index d5b0befe923269..7a1bd4055739e2 100644 --- a/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs +++ b/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs @@ -276,6 +276,7 @@ public unsafe void Indexer() Assert.Equal('b', vsb[3]); vsb[3] = 'c'; Assert.Equal('c', vsb[3]); + vsb.ToString(); } [Fact] @@ -298,6 +299,7 @@ public void EnsureCapacity_IfBufferTimesTwoWins() builder.EnsureCapacity(33); Assert.Equal(64, builder.Capacity); + builder.ToString(); } [Fact] @@ -310,6 +312,7 @@ public void EnsureCapacity_NoAllocIfNotNeeded() builder.EnsureCapacity(16); Assert.Equal(64, builder.Capacity); + builder.ToString(); } } } diff --git a/src/libraries/System.Security.Cryptography/tests/ZeroMemoryTests.cs b/src/libraries/System.Security.Cryptography/tests/ZeroMemoryTests.cs index 5055743c1548b8..5bc0a0eb398b81 100644 --- a/src/libraries/System.Security.Cryptography/tests/ZeroMemoryTests.cs +++ b/src/libraries/System.Security.Cryptography/tests/ZeroMemoryTests.cs @@ -57,6 +57,8 @@ public static void MemoryGetsCleared(int byteLength) { Assert.Equal(0, testSpan[i]); } + + ArrayPool.Shared.Return(rented, clearArray: false); } [Fact] From 7d4246de455c7c4cd4310612e2578231c1072a55 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Thu, 13 Jul 2023 14:59:52 -0500 Subject: [PATCH 12/14] more tests --- .../tests/UnitTests/TranscodingWriteStreamTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Net.Http.Json/tests/UnitTests/TranscodingWriteStreamTests.cs b/src/libraries/System.Net.Http.Json/tests/UnitTests/TranscodingWriteStreamTests.cs index f9e7126fe49b18..b5b32f6c8712eb 100644 --- a/src/libraries/System.Net.Http.Json/tests/UnitTests/TranscodingWriteStreamTests.cs +++ b/src/libraries/System.Net.Http.Json/tests/UnitTests/TranscodingWriteStreamTests.cs @@ -67,7 +67,7 @@ private static async Task WriteAsyncTest(Encoding targetEncoding, string message var model = new TestModel { Message = message }; var stream = new MemoryStream(); - var transcodingStream = new TranscodingWriteStream(stream, targetEncoding); + using var transcodingStream = new TranscodingWriteStream(stream, targetEncoding); await JsonSerializer.SerializeAsync(transcodingStream, model, model.GetType()); // The transcoding streams use Encoders and Decoders that have internal buffers. We need to flush these // when there is no more data to be written. Stream.FlushAsync isn't suitable since it's From 6d2294652d9898c48c6ff13ed70f4192158b4e62 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Thu, 13 Jul 2023 21:24:58 -0500 Subject: [PATCH 13/14] tar tests --- .../tests/TarFile/TarFile.ExtractToDirectory.File.Tests.cs | 2 +- .../tests/TarFile/TarFile.ExtractToDirectoryAsync.File.Tests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Formats.Tar/tests/TarFile/TarFile.ExtractToDirectory.File.Tests.cs b/src/libraries/System.Formats.Tar/tests/TarFile/TarFile.ExtractToDirectory.File.Tests.cs index 53eb65d09e485c..9ffbcc00792703 100644 --- a/src/libraries/System.Formats.Tar/tests/TarFile/TarFile.ExtractToDirectory.File.Tests.cs +++ b/src/libraries/System.Formats.Tar/tests/TarFile/TarFile.ExtractToDirectory.File.Tests.cs @@ -340,7 +340,7 @@ public void UnixFileModes_RestrictiveParentDir(bool overwrite) AssertFileModeEquals(filePath, TestPermission1); } - [Fact] + [ConditionalFact(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] public void LinkBeforeTarget() { using TempDirectory source = new TempDirectory(); diff --git a/src/libraries/System.Formats.Tar/tests/TarFile/TarFile.ExtractToDirectoryAsync.File.Tests.cs b/src/libraries/System.Formats.Tar/tests/TarFile/TarFile.ExtractToDirectoryAsync.File.Tests.cs index 62c3f746f08b3c..42b0eef65eef87 100644 --- a/src/libraries/System.Formats.Tar/tests/TarFile/TarFile.ExtractToDirectoryAsync.File.Tests.cs +++ b/src/libraries/System.Formats.Tar/tests/TarFile/TarFile.ExtractToDirectoryAsync.File.Tests.cs @@ -362,7 +362,7 @@ public async Task UnixFileModes_RestrictiveParentDir_Async() AssertFileModeEquals(filePath, TestPermission1); } - [Fact] + [ConditionalFact(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] public async Task LinkBeforeTargetAsync() { using TempDirectory source = new TempDirectory(); From d512f19ef3a506c01bb3a8588de48cb377472639 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Mon, 17 Jul 2023 12:55:58 -0500 Subject: [PATCH 14/14] feedback --- .../System/Net/Security/FakeNtlmServer.cs | 7 ++-- .../System/IO/FileCleanupTestBase.cs | 34 ++++++++----------- .../System/Text/ValueStringBuilderTests.cs | 6 ++-- .../tests/MemoryPool/MemoryPool.cs | 4 +-- 4 files changed, 22 insertions(+), 29 deletions(-) diff --git a/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs b/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs index 8e3ea90bc17305..cb7a3a785e7faf 100644 --- a/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs +++ b/src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs @@ -404,11 +404,8 @@ private void ValidateAuthentication(byte[] incomingBlob) public void ResetKeys() { - if (_clientSeal != null) - _clientSeal.Dispose(); - - if (_serverSeal != null) - _serverSeal.Dispose(); + _clientSeal?.Dispose(); + _serverSeal?.Dispose(); _clientSeal = new RC4(_clientSealingKey); _serverSeal = new RC4(_serverSealingKey); diff --git a/src/libraries/Common/tests/TestUtilities/System/IO/FileCleanupTestBase.cs b/src/libraries/Common/tests/TestUtilities/System/IO/FileCleanupTestBase.cs index 784aec4f151947..a40bbce709b054 100644 --- a/src/libraries/Common/tests/TestUtilities/System/IO/FileCleanupTestBase.cs +++ b/src/libraries/Common/tests/TestUtilities/System/IO/FileCleanupTestBase.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Buffers; +using System.ComponentModel; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Text; @@ -201,21 +202,24 @@ private unsafe string GetTestDirectoryActualCasing() if (!handle.IsInvalid) { - const int InitialBufferSize = 4096; - char[]? buffer = ArrayPool.Shared.Rent(InitialBufferSize); - uint result = GetFinalPathNameByHandle(handle, buffer); + char[] buffer = new char[4096]; + uint result; + fixed (char* bufPtr = buffer) + { + result = Interop.Kernel32.GetFinalPathNameByHandle(handle, bufPtr, (uint)buffer.Length, Interop.Kernel32.FILE_NAME_NORMALIZED); + } - // Remove extended prefix - int skip = PathInternal.IsExtended(buffer) ? 4 : 0; + if (result == 0) + { + throw new Win32Exception(); + } - string str = new string( - buffer, - skip, - (int)result - skip); + Debug.Assert(result <= buffer.Length); - ArrayPool.Shared.Return(buffer); + // Remove extended prefix + int skip = PathInternal.IsExtended(buffer) ? 4 : 0; - return str; + return new string(buffer, skip, (int)result - skip); } } catch { } @@ -223,14 +227,6 @@ private unsafe string GetTestDirectoryActualCasing() return TestDirectory; } - private unsafe uint GetFinalPathNameByHandle(SafeFileHandle handle, char[] buffer) - { - fixed (char* bufPtr = buffer) - { - return Interop.Kernel32.GetFinalPathNameByHandle(handle, bufPtr, (uint)buffer.Length, Interop.Kernel32.FILE_NAME_NORMALIZED); - } - } - protected string CreateTestDirectory(params string[] paths) { string dir = Path.Combine(paths); diff --git a/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs b/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs index 7a1bd4055739e2..728749ad34e861 100644 --- a/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs +++ b/src/libraries/Common/tests/Tests/System/Text/ValueStringBuilderTests.cs @@ -276,7 +276,7 @@ public unsafe void Indexer() Assert.Equal('b', vsb[3]); vsb[3] = 'c'; Assert.Equal('c', vsb[3]); - vsb.ToString(); + vsb.Dispose(); } [Fact] @@ -299,7 +299,7 @@ public void EnsureCapacity_IfBufferTimesTwoWins() builder.EnsureCapacity(33); Assert.Equal(64, builder.Capacity); - builder.ToString(); + builder.Dispose(); } [Fact] @@ -312,7 +312,7 @@ public void EnsureCapacity_NoAllocIfNotNeeded() builder.EnsureCapacity(16); Assert.Equal(64, builder.Capacity); - builder.ToString(); + builder.Dispose(); } } } diff --git a/src/libraries/System.Memory/tests/MemoryPool/MemoryPool.cs b/src/libraries/System.Memory/tests/MemoryPool/MemoryPool.cs index 88eec631069619..e040a363493bf1 100644 --- a/src/libraries/System.Memory/tests/MemoryPool/MemoryPool.cs +++ b/src/libraries/System.Memory/tests/MemoryPool/MemoryPool.cs @@ -231,7 +231,7 @@ public static void MemoryPoolTryGetArray() [Fact] public static void ExtraDisposesAreIgnored() { - using IMemoryOwner block = MemoryPool.Shared.Rent(42); + IMemoryOwner block = MemoryPool.Shared.Rent(42); block.Dispose(); block.Dispose(); } @@ -239,7 +239,7 @@ public static void ExtraDisposesAreIgnored() [Fact] public static void NoMemoryAfterDispose() { - using IMemoryOwner block = MemoryPool.Shared.Rent(42); + IMemoryOwner block = MemoryPool.Shared.Rent(42); block.Dispose(); Assert.Throws(() => block.Memory); }