]> granicus.if.org Git - vim/commitdiff
patch 8.0.1073: may get an endless loop if 'statusline' changes a highlight v8.0.1073
authorBram Moolenaar <Bram@vim.org>
Fri, 8 Sep 2017 11:59:21 +0000 (13:59 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 8 Sep 2017 11:59:21 +0000 (13:59 +0200)
Problem:    May get an endless loop if 'statusline' changes a highlight.
Solution:   Do not let evaluating 'statusline' trigger a redraw.

src/buffer.c
src/version.c

index e95abfa5af72f7e5287eec83c844e2142641f718..57330bfa147afc076746f3d2e79adf6e9c3cd502 100644 (file)
@@ -3915,8 +3915,8 @@ build_stl_str_hl(
     char_u     *t;
     int                byteval;
 #ifdef FEAT_EVAL
-    win_T      *o_curwin;
-    buf_T      *o_curbuf;
+    win_T      *save_curwin;
+    buf_T      *save_curbuf;
 #endif
     int                empty_line;
     colnr_T    virtcol;
@@ -3958,6 +3958,9 @@ build_stl_str_hl(
     char_u     tmp[TMPLEN];
     char_u     *usefmt = fmt;
     struct stl_hlrec *sp;
+    int                save_must_redraw = must_redraw;
+    int                save_redr_type = curwin->w_redr_type;
+    int                save_highlight_shcnaged = need_highlight_changed;
 
 #ifdef FEAT_EVAL
     /*
@@ -4267,15 +4270,15 @@ build_stl_str_hl(
            vim_snprintf((char *)tmp, sizeof(tmp), "%d", curbuf->b_fnum);
            set_internal_string_var((char_u *)"actual_curbuf", tmp);
 
-           o_curbuf = curbuf;
-           o_curwin = curwin;
+           save_curbuf = curbuf;
+           save_curwin = curwin;
            curwin = wp;
            curbuf = wp->w_buffer;
 
            str = eval_to_string_safe(p, &t, use_sandbox);
 
-           curwin = o_curwin;
-           curbuf = o_curbuf;
+           curwin = save_curwin;
+           curbuf = save_curbuf;
            do_unlet((char_u *)"g:actual_curbuf", TRUE);
 
            if (str != NULL && *str != 0)
@@ -4730,6 +4733,13 @@ build_stl_str_hl(
        sp->userhl = 0;
     }
 
+    /* We do not want redrawing a stausline, ruler, title, etc. to trigger
+     * another redraw, it may cause an endless loop.  This happens when a
+     * statusline changes a highlight group. */
+    must_redraw = save_must_redraw;
+    curwin->w_redr_type = save_redr_type;
+    need_highlight_changed = save_highlight_shcnaged;
+
     return width;
 }
 #endif /* FEAT_STL_OPT */
index 2ffd91a509dccd15fa9d36a2e0d9e3fcdfc46ea6..9ec37eb66787d3ac56b768dae956b601868a0b10 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1073,
 /**/
     1072,
 /**/