]> granicus.if.org Git - vim/commitdiff
patch 8.0.1115: crash when using foldtextresult() recursively v8.0.1115
authorBram Moolenaar <Bram@vim.org>
Sat, 16 Sep 2017 15:19:22 +0000 (17:19 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 16 Sep 2017 15:19:22 +0000 (17:19 +0200)
Problem:    Crash when using foldtextresult() recursively.
Solution:   Avoid recursive calls. (Yasuhiro Matsumoto, closes #2098)

src/evalfunc.c
src/testdir/test_fold.vim
src/version.c

index 63aa34c5d3f6611e7964823c9e52d00a91e62bbb..d438a89126c8fb2d05cc0d7d7994b336b3e07889 100644 (file)
@@ -3642,11 +3642,16 @@ f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv)
     char_u     buf[FOLD_TEXT_LEN];
     foldinfo_T  foldinfo;
     int                fold_count;
+    static int entered = FALSE;
 #endif
 
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
 #ifdef FEAT_FOLDING
+    if (entered)
+       return; /* reject recursive use */
+    entered = TRUE;
+
     lnum = get_tv_lnum(argvars);
     /* treat illegal types and illegal string values for {lnum} the same */
     if (lnum < 0)
@@ -3660,6 +3665,8 @@ f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv)
            text = vim_strsave(text);
        rettv->vval.v_string = text;
     }
+
+    entered = FALSE;
 #endif
 }
 
index 213c0fa4583c97de5dcf613a1f5caed80f570533..b6ba99c56fc234043d2c5239589df3c9ca02581c 100644 (file)
@@ -278,6 +278,7 @@ func Test_move_folds_around_manual()
   call assert_equal(0, foldlevel(6))
   call assert_equal(9, foldclosedend(7))
   call assert_equal([-1, 2, 2, 2, 2, -1, 7, 7, 7, -1], map(range(1, line('$')), 'foldclosed(v:val)'))
+
   %d
   " Ensure moving around the edges still works.
   call setline(1, PrepIndent("a") + repeat(["a"], 3) + ["\ta"])
@@ -446,3 +447,16 @@ func Test_fold_error()
   set foldmethod&
   bw!
 endfunc
+
+func Test_foldtext_recursive()
+  new
+  call setline(1, ['{{{', 'some text', '}}}'])
+  setlocal foldenable foldmethod=marker foldtext=foldtextresult(v\:foldstart)
+  " This was crashing because of endless recursion.
+  2foldclose
+  redraw
+  call assert_equal(1, foldlevel(2))
+  call assert_equal(1, foldclosed(2))
+  call assert_equal(3, foldclosedend(2))
+  bwipe!
+endfunc
index 90aa45c0f46e24ac1da58399c1c5d14596753065..8b777e7e171b18d710b28e0c85044ee167e16119 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1115,
 /**/
     1114,
 /**/