Browse Source

Fix line break enumerator infinite loop (#21808)

* Add failing test: LineBreakEnumerator infinite loop on empty string

* Return false immediately for empty string in LineBreakEnumerator

Empty text has no content and should not produce any line break
opportunities. Short-circuit in MoveNext before entering the
read/rule loop, while keeping the PeekAt EndOfText fix as a
defensive safeguard.
pull/21823/head
Dong Bin 2 months ago
committed by GitHub
parent
commit
14118ef7cd
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 5
      src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs
  2. 8
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs

5
src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs

@ -24,6 +24,11 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ {
lineBreak = default; lineBreak = default;
if (_text.IsEmpty)
{
return false;
}
if (_state.Current.EndOfText) if (_state.Current.EndOfText)
{ {
return false; return false;

8
tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs

@ -19,6 +19,14 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
_outputHelper = outputHelper; _outputHelper = outputHelper;
} }
[Fact]
public void ShouldHandleEmptyString()
{
var lineBreaker = new LineBreakEnumerator(string.Empty);
Assert.False(lineBreaker.MoveNext(out _));
}
[Fact] [Fact]
public void BasicLatinTest() public void BasicLatinTest()
{ {

Loading…
Cancel
Save