To: vim_dev@googlegroups.com Subject: Patch 8.2.1787 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1787 Problem: Crash with 'incsearch' and very long line. Solution: Check whether regprog becomes NULL. (closes #7063) Files: src/search.c, src/testdir/test_search.vim *** ../vim-8.2.1786/src/search.c 2020-09-22 22:08:28.559532201 +0200 --- src/search.c 2020-10-02 20:35:19.997427200 +0200 *************** *** 759,764 **** --- 759,767 ---- 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,863 **** --- 861,869 ---- 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,977 **** --- 978,986 ---- #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,1070 **** --- 1074,1083 ---- } 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,2917 **** pos.lnum, regmatch.startpos[0].col, NULL, NULL); if (nmatched != 0) break; ! } while (direction == FORWARD ? regmatch.startpos[0].col < pos.col : regmatch.startpos[0].col > pos.col); if (called_emsg == called_emsg_before) --- 2924,2931 ---- pos.lnum, regmatch.startpos[0].col, NULL, NULL); if (nmatched != 0) break; ! } while (regmatch.regprog != NULL ! && direction == FORWARD ? regmatch.startpos[0].col < pos.col : regmatch.startpos[0].col > pos.col); if (called_emsg == called_emsg_before) *** ../vim-8.2.1786/src/testdir/test_search.vim 2020-09-26 22:39:18.427725844 +0200 --- src/testdir/test_search.vim 2020-10-02 20:32:03.537989616 +0200 *************** *** 964,969 **** --- 964,983 ---- 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 *** ../vim-8.2.1786/src/version.c 2020-10-02 18:48:02.846263669 +0200 --- src/version.c 2020-10-02 20:26:54.078875479 +0200 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 1787, /**/ -- How To Keep A Healthy Level Of Insanity: 12. Sing along at the opera. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///