From 495b7dd213e096361e6f15e7aed313c1d63d9d3e Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 16 Sep 2017 17:19:22 +0200 Subject: patch 8.0.1115: crash when using foldtextresult() recursively Problem: Crash when using foldtextresult() recursively. Solution: Avoid recursive calls. (Yasuhiro Matsumoto, closes #2098) --- src/evalfunc.c | 7 +++++++ src/testdir/test_fold.vim | 14 ++++++++++++++ src/version.c | 2 ++ 3 files changed, 23 insertions(+) (limited to 'src') diff --git a/src/evalfunc.c b/src/evalfunc.c index 63aa34c5d..d438a8912 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -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 } diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim index 213c0fa45..b6ba99c56 100644 --- a/src/testdir/test_fold.vim +++ b/src/testdir/test_fold.vim @@ -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 diff --git a/src/version.c b/src/version.c index 90aa45c0f..8b777e7e1 100644 --- a/src/version.c +++ b/src/version.c @@ -769,6 +769,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1115, /**/ 1114, /**/ -- cgit v1.2.3