From 811be7b1ac4cafbc6ede2a4dc1b7c004247d3a00 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 25 May 2026 18:02:22 -0700 Subject: [PATCH] fix(addon-search): prevent infinite loop on empty reverse regex matches Advance regex lastIndex when skipping zero-length matches during reverse search to avoid hanging on patterns like .*? Co-authored-by: Cursor --- addons/addon-search/src/SearchEngine.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/addons/addon-search/src/SearchEngine.ts b/addons/addon-search/src/SearchEngine.ts index c14822d21..7fa09edf2 100644 --- a/addons/addon-search/src/SearchEngine.ts +++ b/addons/addon-search/src/SearchEngine.ts @@ -315,6 +315,10 @@ export class SearchEngine { const searchSubstring = searchStringLine.slice(0, offset); while (foundTerm = searchRegex.exec(searchSubstring)) { if (foundTerm[0].length === 0) { + if (searchRegex.lastIndex >= searchSubstring.length) { + break; + } + searchRegex.lastIndex++; continue; } resultIndex = searchRegex.lastIndex - foundTerm[0].length; @@ -364,8 +368,13 @@ export class SearchEngine { let foundTerm: RegExpExecArray | null; if (isReverseSearch) { resultIndex = -1; - while (foundTerm = searchRegex.exec(searchStringLine.slice(0, offset))) { + const wholeWordSubstring = searchStringLine.slice(0, offset); + while (foundTerm = searchRegex.exec(wholeWordSubstring)) { if (foundTerm[0].length === 0) { + if (searchRegex.lastIndex >= wholeWordSubstring.length) { + break; + } + searchRegex.lastIndex++; continue; } const candidateIndex = searchRegex.lastIndex - foundTerm[0].length;