Permalink
Browse files

patch 8.0.1115: crash when using foldtextresult() recursively

Problem:    Crash when using foldtextresult() recursively.
Solution:   Avoid recursive calls. (Yasuhiro Matsumoto, closes #2098)
  • Loading branch information...
brammool committed Sep 16, 2017
1 parent 4cf56bb commit 495b7dd213e096361e6f15e7aed313c1d63d9d3e
Showing with 23 additions and 0 deletions.
  1. +7 −0 src/evalfunc.c
  2. +14 −0 src/testdir/test_fold.vim
  3. +2 −0 src/version.c
View
@@ -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
}
View
@@ -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
View
@@ -769,6 +769,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1115,
/**/
1114,
/**/

0 comments on commit 495b7dd

Please sign in to comment.