From: Bram Moolenaar Date: Fri, 2 Oct 2020 18:36:01 +0000 (+0200) Subject: patch 8.2.1787: crash with 'incsearch' and very long line X-Git-Tag: v8.2.1787 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=795aaa1e84d76a6fe066694de9876b8a21cbe40c;p=vim patch 8.2.1787: crash with 'incsearch' and very long line Problem: Crash with 'incsearch' and very long line. Solution: Check whether regprog becomes NULL. (closes #7063) --- diff --git a/src/search.c b/src/search.c index badf79371..fd668383b 100644 --- a/src/search.c +++ b/src/search.c @@ -759,6 +759,9 @@ searchit( NULL, NULL #endif ); + // vim_regexec_multi() may clear "regprog" + if (regmatch.regprog == NULL) + break; // Abort searching on an error (e.g., out of stack). if (called_emsg > called_emsg_before #ifdef FEAT_RELTIME @@ -858,6 +861,9 @@ searchit( match_ok = FALSE; break; } + // vim_regexec_multi() may clear "regprog" + if (regmatch.regprog == NULL) + break; matchpos = regmatch.startpos[0]; endpos = regmatch.endpos[0]; # ifdef FEAT_EVAL @@ -972,6 +978,9 @@ searchit( #endif break; } + // vim_regexec_multi() may clear "regprog" + if (regmatch.regprog == NULL) + break; // Need to get the line pointer again, a // multi-line search may have made it invalid. @@ -1065,6 +1074,10 @@ searchit( } at_first_line = FALSE; + // vim_regexec_multi() may clear "regprog" + if (regmatch.regprog == NULL) + break; + /* * Stop the search if wrapscan isn't set, "stop_lnum" is * specified, after an interrupt, after a match and after looping @@ -2911,7 +2924,8 @@ is_zero_width(char_u *pattern, int move, pos_T *cur, int direction) pos.lnum, regmatch.startpos[0].col, NULL, NULL); if (nmatched != 0) break; - } while (direction == FORWARD ? regmatch.startpos[0].col < pos.col + } while (regmatch.regprog != NULL + && direction == FORWARD ? regmatch.startpos[0].col < pos.col : regmatch.startpos[0].col > pos.col); if (called_emsg == called_emsg_before) diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim index e39458f71..f62914e3e 100644 --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -964,6 +964,20 @@ func Test_incsearch_substitute() call Incsearch_cleanup() endfunc +func Test_incsearch_substitute_long_line() + new + call test_override("char_avail", 1) + set incsearch + + call repeat('x', 100000)->setline(1) + call feedkeys(':s/\%c', 'xt') + redraw + call feedkeys("\", 'xt') + + call Incsearch_cleanup() + bwipe! +endfunc + " Similar to Test_incsearch_substitute() but with a screendump halfway. func Test_incsearch_substitute_dump() CheckOption incsearch diff --git a/src/version.c b/src/version.c index 7f528b933..877d63de4 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1787, /**/ 1786, /**/