diff --git a/src/libraries/System.Private.CoreLib/src/System/Text/EncodingProvider.cs b/src/libraries/System.Private.CoreLib/src/System/Text/EncodingProvider.cs index 8857f0fa713bf0..3e8723c9fcab57 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Text/EncodingProvider.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Text/EncodingProvider.cs @@ -71,7 +71,7 @@ internal static void AddProvider(EncodingProvider provider) var newProviders = new EncodingProvider[providers.Length + 1]; Array.Copy(providers, newProviders, providers.Length); - providers[^1] = provider; + newProviders[^1] = provider; if (Interlocked.CompareExchange(ref s_providers, newProviders, providers) == providers) { diff --git a/src/libraries/System.Runtime/tests/System/Text/EncodingTests.cs b/src/libraries/System.Runtime/tests/System/Text/EncodingTests.cs index b598a219885150..4aec989f3e7f10 100644 --- a/src/libraries/System.Runtime/tests/System/Text/EncodingTests.cs +++ b/src/libraries/System.Runtime/tests/System/Text/EncodingTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; +using Microsoft.DotNet.RemoteExecutor; using Moq; using Xunit; @@ -106,6 +107,25 @@ public void GetEncodings_FromProvider_DoesNotContainDisallowedEncodings(string e }); } + [ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] + public void RegisterProvider_EncodingsAreUsable() + { + RemoteExecutor.Invoke(() => + { + for (int i = 0; i < 10; i++) + { + Encoding.RegisterProvider(new NullEncodingProvider()); + Assert.Same(Encoding.UTF8, Encoding.GetEncoding(65001)); + } + }).Dispose(); + } + + private sealed class NullEncodingProvider : EncodingProvider + { + public override Encoding GetEncoding(int codepage) => null; + public override Encoding GetEncoding(string name) => null; + } + private sealed class ThreadStaticEncodingProvider : EncodingProvider { private static readonly object _globalRegistrationLockObj = new object();