0
0
mirror of https://github.com/vim/vim.git synced 2025-07-25 10:54:51 -04:00

patch 7.4.2323

Problem:    Using freed memory when using 'formatexpr'. (Dominique Pelle)
Solution:   Make a copy of 'formatexpr' before evaluating it.
This commit is contained in:
Bram Moolenaar 2016-09-04 15:13:39 +02:00
parent bc54f3f3fe
commit d77f9d595e
3 changed files with 34 additions and 1 deletions

View File

@ -4741,6 +4741,7 @@ fex_format(
int use_sandbox = was_set_insecurely((char_u *)"formatexpr", int use_sandbox = was_set_insecurely((char_u *)"formatexpr",
OPT_LOCAL); OPT_LOCAL);
int r; int r;
char_u *fex;
/* /*
* Set v:lnum to the first line number and v:count to the number of lines. * Set v:lnum to the first line number and v:count to the number of lines.
@ -4750,16 +4751,22 @@ fex_format(
set_vim_var_nr(VV_COUNT, count); set_vim_var_nr(VV_COUNT, count);
set_vim_var_char(c); set_vim_var_char(c);
/* Make a copy, the option could be changed while calling it. */
fex = vim_strsave(curbuf->b_p_fex);
if (fex == NULL)
return 0;
/* /*
* Evaluate the function. * Evaluate the function.
*/ */
if (use_sandbox) if (use_sandbox)
++sandbox; ++sandbox;
r = (int)eval_to_number(curbuf->b_p_fex); r = (int)eval_to_number(fex);
if (use_sandbox) if (use_sandbox)
--sandbox; --sandbox;
set_vim_var_string(VV_CHAR, NULL, -1); set_vim_var_string(VV_CHAR, NULL, -1);
vim_free(fex);
return r; return r;
} }

View File

@ -192,6 +192,30 @@ func! Test_normal05_formatexpr()
bw! bw!
endfu endfu
func Test_normal05_formatexpr_newbuf()
" Edit another buffer in the 'formatexpr' function
new
func! Format()
edit another
endfunc
set formatexpr=Format()
norm gqG
bw!
set formatexpr=
endfunc
func Test_normal05_formatexpr_setopt()
" Change the 'formatexpr' value in the function
new
func! Format()
set formatexpr=
endfunc
set formatexpr=Format()
norm gqG
bw!
set formatexpr=
endfunc
func! Test_normal06_formatprg() func! Test_normal06_formatprg()
" basic test for formatprg " basic test for formatprg
" only test on non windows platform " only test on non windows platform

View File

@ -763,6 +763,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2323,
/**/ /**/
2322, 2322,
/**/ /**/