changeset 31315:6a03cc83fcc5 v9.0.0991

patch 9.0.0991: crash when reading help index with various options set Commit: https://github.com/vim/vim/commit/c67c89c7589253215d57bad588edcf83a9403560 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Dec 2 16:39:44 2022 +0000 patch 9.0.0991: crash when reading help index with various options set Problem: Crash when reading help index with various options set. (Marius Gedminas) Solution: Do not set wlv.c_extra to NUL when wlv.p_extra is NULL. (closes #11651)
author Bram Moolenaar <Bram@vim.org>
date Fri, 02 Dec 2022 17:45:03 +0100
parents e8dca3baf3c7
children 646b2a1e9716
files src/drawline.c src/testdir/test_breakindent.vim src/version.c
diffstat 3 files changed, 29 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -2894,10 +2894,10 @@ win_line(
 		// into "ScreenLines".
 		if (c == TAB && (!wp->w_p_list || wp->w_lcs_chars.tab1))
 		{
-		    int tab_len = 0;
-		    long vcol_adjusted = wlv.vcol; // removed showbreak length
+		    int	    tab_len = 0;
+		    long    vcol_adjusted = wlv.vcol; // removed showbreak len
 #ifdef FEAT_LINEBREAK
-		    char_u *sbr = get_showbreak_value(wp);
+		    char_u  *sbr = get_showbreak_value(wp);
 
 		    // only adjust the tab_len, when at the first column
 		    // after the showbreak value was drawn
@@ -2917,8 +2917,10 @@ win_line(
 #ifdef FEAT_LINEBREAK
 		    if (!wp->w_p_lbr || !wp->w_p_list)
 #endif
+		    {
 			// tab amount depends on current column
 			wlv.n_extra = tab_len;
+		    }
 #ifdef FEAT_LINEBREAK
 		    else
 		    {
@@ -2940,9 +2942,9 @@ win_line(
 # endif
 			if (tab_len > 0)
 			{
-			    // If wlv.n_extra > 0, it gives the number of
-			    // chars, to use for a tab, else we need to
-			    // calculate the width for a tab.
+			    // If wlv.n_extra > 0, it gives the number of chars
+			    // to use for a tab, else we need to calculate the
+			    // width for a tab.
 			    int tab2_len = mb_char2len(wp->w_lcs_chars.tab2);
 			    len = tab_len * tab2_len;
 			    if (wp->w_lcs_chars.tab3)
@@ -3018,7 +3020,7 @@ win_line(
 							? wp->w_lcs_chars.tab3
 							: wp->w_lcs_chars.tab1;
 #ifdef FEAT_LINEBREAK
-			if (wp->w_p_lbr)
+			if (wp->w_p_lbr && wlv.p_extra != NULL)
 			    wlv.c_extra = NUL; // using p_extra from above
 			else
 #endif
--- a/src/testdir/test_breakindent.vim
+++ b/src/testdir/test_breakindent.vim
@@ -1034,4 +1034,22 @@ func Test_breakindent_column()
   bwipeout!
 endfunc
 
+func Test_linebreak_list()
+  " This was setting wlv.c_extra to NUL while wlv.p_extra is NULL
+  filetype plugin on
+  syntax enable
+  edit! $VIMRUNTIME/doc/index.txt
+  /v_P
+
+  setlocal list
+  setlocal listchars=tab:>-
+  setlocal linebreak
+  setlocal nowrap
+  setlocal filetype=help
+  redraw!
+
+  bwipe!
+endfunc
+
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    991,
+/**/
     990,
 /**/
     989,