aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/indent.c11
-rw-r--r--src/nvim/testdir/test_options.vim12
2 files changed, 21 insertions, 2 deletions
diff --git a/src/nvim/indent.c b/src/nvim/indent.c
index efca739c2d..c94186a1f2 100644
--- a/src/nvim/indent.c
+++ b/src/nvim/indent.c
@@ -520,7 +520,7 @@ int inindent(int extra)
// Get indent level from 'indentexpr'.
int get_expr_indent(void)
{
- int indent;
+ int indent = -1;
pos_T save_pos;
colnr_T save_curswant;
int save_set_curswant;
@@ -538,7 +538,14 @@ int get_expr_indent(void)
sandbox++;
}
textlock++;
- indent = (int)eval_to_number(curbuf->b_p_inde);
+
+ // Need to make a copy, the 'indentexpr' option could be changed while
+ // evaluating it.
+ char_u *inde_copy = vim_strsave(curbuf->b_p_inde);
+ if (inde_copy != NULL) {
+ indent = (int)eval_to_number(inde_copy);
+ xfree(inde_copy);
+ }
if (use_sandbox) {
sandbox--;
diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim
index 5ae8528ee9..d9cd5fd583 100644
--- a/src/nvim/testdir/test_options.vim
+++ b/src/nvim/testdir/test_options.vim
@@ -275,3 +275,15 @@ func Test_complete()
set complete&
endfun
+func ResetIndentexpr()
+ set indentexpr=
+endfunc
+
+func Test_set_indentexpr()
+ " this was causing usage of freed memory
+ set indentexpr=ResetIndentexpr()
+ new
+ call feedkeys("i\<c-f>", 'x')
+ call assert_equal('', &indentexpr)
+ bwipe!
+endfunc