diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result_view.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result_view.cc index a21a16a12a9c9..753d97911d07e 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result_view.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result_view.cc @@ -548,6 +548,15 @@ float ShapeResultView::ForEachGraphemeClusters(const StringView& text, continue; } + if (current_character_index >= text.length()) [[unlikely]] { + // TODO(crbug.com/1147011): This should not happen, but crash logs + // indicate that |character_index| can exceed |num_characters_|. + // See also crbug.com/1286882. Unlike ForEachGlyphImpl, the LTR + // branch above has no upper bound, so guard here before the + // callback indexes into |text|. + NOTREACHED(); + } + cluster_advance += glyph_data.advance.ToFloat(); if (text.Is8Bit()) {