From 14118ef7cd57f515b61e504dffa251b7f9201ca0 Mon Sep 17 00:00:00 2001 From: Dong Bin <14807942+rabbitism@users.noreply.github.com> Date: Tue, 21 Jul 2026 17:15:15 +0800 Subject: [PATCH] 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. --- .../Media/TextFormatting/Unicode/LineBreakEnumerator.cs | 5 +++++ .../Media/TextFormatting/LineBreakEnumeratorTests.cs | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs index 576f0ad872..2198a18cd3 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs @@ -24,6 +24,11 @@ namespace Avalonia.Media.TextFormatting.Unicode { lineBreak = default; + if (_text.IsEmpty) + { + return false; + } + if (_state.Current.EndOfText) { return false; diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs index 59ddf6932e..56d346fc59 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs @@ -19,6 +19,14 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting _outputHelper = outputHelper; } + [Fact] + public void ShouldHandleEmptyString() + { + var lineBreaker = new LineBreakEnumerator(string.Empty); + + Assert.False(lineBreaker.MoveNext(out _)); + } + [Fact] public void BasicLatinTest() {