Problem: Using freed memory when resetting 'indentexpr' while evaluating
it. (Dominique Pelle)
Solution: Make a copy of 'indentexpr'.
get_expr_indent(void)
{
int indent;
+ char_u *inde_copy;
pos_T save_pos;
colnr_T save_curswant;
int save_set_curswant;
if (use_sandbox)
++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. */
+ inde_copy = vim_strsave(curbuf->b_p_inde);
+ if (inde_copy != NULL)
+ {
+ indent = (int)eval_to_number(inde_copy);
+ vim_free(inde_copy);
+ }
+
if (use_sandbox)
--sandbox;
--textlock;
throw 'Skipped: opt_test.vim does not exist'
endif
endfunc
+
+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
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 575,
/**/
574,
/**/