]> granicus.if.org Git - vim/commitdiff
patch 9.0.0991: crash when reading help index with various options set v9.0.0991
authorBram Moolenaar <Bram@vim.org>
Fri, 2 Dec 2022 16:39:44 +0000 (16:39 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 2 Dec 2022 16:39:44 +0000 (16:39 +0000)
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)

src/drawline.c
src/testdir/test_breakindent.vim
src/version.c

index d0a4cc15ed95a83ac68ef62656771cbd6d812c59..e2849a1ff8ac1f29001a1cdd78f57f38c2cc971f 100644 (file)
@@ -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
index 9719c3d0a2c501588bd8eee47b663927f727527e..27b1d98475dd7d7adb08402fd9c4ed03d1602f1e 100644 (file)
@@ -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
index f9b1e6c220f7a2ac6d6422d767324116d1a711b6..07a6093640dbb08c027c133e89a3ba3397d3f9df 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    991,
 /**/
     990,
 /**/