Skip to content

Commit 7f96aef

Browse files
tarekghstephentoub
andauthored
Check source and destination spans overlap in TryNormalize method (#118047)
Co-authored-by: Stephen Toub <[email protected]>
1 parent a2b08f1 commit 7f96aef

File tree

2 files changed

+10
-0
lines changed

2 files changed

+10
-0
lines changed

src/libraries/System.Private.CoreLib/src/System/Globalization/Normalization.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ internal static bool TryNormalize(ReadOnlySpan<char> source, Span<char> destinat
4444
{
4545
CheckNormalizationForm(normalizationForm);
4646

47+
if (source.Overlaps(destination))
48+
{
49+
ThrowHelper.ThrowArgumentException(ExceptionResource.InvalidOperation_SpanOverlappedOperation);
50+
}
51+
4752
// In Invariant mode we assume all characters are normalized because we don't support any linguistic operations on strings.
4853
// If it's ASCII && one of the 4 main forms, then it's already normalized.
4954
if (GlobalizationMode.Invariant || Ascii.IsValid(source))

src/libraries/System.Runtime/tests/System.Globalization.Extensions.Tests/Normalization/StringNormalizationTests.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,11 @@ public void Normalize_Invalid()
126126

127127
AssertExtensions.Throws<ArgumentException>("strInput", () => "\uD800\uD800".Normalize()); // Invalid surrogate pair
128128
AssertExtensions.Throws<ArgumentException>("source", () => "\uD800\uD800".AsSpan().TryNormalize(destination, out int charsWritten)); // Invalid surrogate pair
129+
130+
char[] overlappingDestination = new char[5] { 'a', 'b', 'c', 'd', 'e' };
131+
Assert.Throws<ArgumentException>(() => overlappingDestination.AsSpan().TryNormalize(overlappingDestination.AsSpan(), out int charsWritten, NormalizationForm.FormC));
132+
Assert.Throws<ArgumentException>(() => overlappingDestination.AsSpan(0, 3).TryNormalize(overlappingDestination.AsSpan(), out int charsWritten, NormalizationForm.FormC));
133+
Assert.Throws<ArgumentException>(() => overlappingDestination.AsSpan(4).TryNormalize(overlappingDestination.AsSpan(), out int charsWritten, NormalizationForm.FormC));
129134
}
130135

131136
[Fact]

0 commit comments

Comments
 (0)