mirror of
https://github.com/vim/vim.git
synced 2025-09-30 04:44:14 -04:00
patch 8.0.0942: using freed memory with ":terminal"
Problem: Using freed memory with ":terminal" if an autocommand changes 'shell' when splitting the window. (Marius Gedminas) Solution: Make a copy of 'shell'. (closes #1974)
This commit is contained in:
@@ -392,7 +392,8 @@ term_start(typval_T *argvar, jobopt_T *opt, int forceit)
|
|||||||
setup_job_options(opt, term->tl_rows, term->tl_cols);
|
setup_job_options(opt, term->tl_rows, term->tl_cols);
|
||||||
|
|
||||||
/* System dependent: setup the vterm and start the job in it. */
|
/* System dependent: setup the vterm and start the job in it. */
|
||||||
if (term_and_job_init(term, term->tl_rows, term->tl_cols, argvar, opt) == OK)
|
if (term_and_job_init(term, term->tl_rows, term->tl_cols, argvar, opt)
|
||||||
|
== OK)
|
||||||
{
|
{
|
||||||
/* Get and remember the size we ended up with. Update the pty. */
|
/* Get and remember the size we ended up with. Update the pty. */
|
||||||
vterm_get_size(term->tl_vterm, &term->tl_rows, &term->tl_cols);
|
vterm_get_size(term->tl_vterm, &term->tl_rows, &term->tl_cols);
|
||||||
@@ -434,6 +435,7 @@ ex_terminal(exarg_T *eap)
|
|||||||
typval_T argvar;
|
typval_T argvar;
|
||||||
jobopt_T opt;
|
jobopt_T opt;
|
||||||
char_u *cmd;
|
char_u *cmd;
|
||||||
|
char_u *tofree = NULL;
|
||||||
|
|
||||||
init_job_options(&opt);
|
init_job_options(&opt);
|
||||||
|
|
||||||
@@ -462,7 +464,8 @@ ex_terminal(exarg_T *eap)
|
|||||||
cmd = skipwhite(p);
|
cmd = skipwhite(p);
|
||||||
}
|
}
|
||||||
if (cmd == NULL || *cmd == NUL)
|
if (cmd == NULL || *cmd == NUL)
|
||||||
cmd = p_sh;
|
/* Make a copy, an autocommand may set 'shell'. */
|
||||||
|
tofree = cmd = vim_strsave(p_sh);
|
||||||
|
|
||||||
if (eap->addr_count == 2)
|
if (eap->addr_count == 2)
|
||||||
{
|
{
|
||||||
@@ -480,6 +483,7 @@ ex_terminal(exarg_T *eap)
|
|||||||
argvar.v_type = VAR_STRING;
|
argvar.v_type = VAR_STRING;
|
||||||
argvar.vval.v_string = cmd;
|
argvar.vval.v_string = cmd;
|
||||||
term_start(&argvar, &opt, eap->forceit);
|
term_start(&argvar, &opt, eap->forceit);
|
||||||
|
vim_free(tofree);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -769,6 +769,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 */
|
||||||
|
/**/
|
||||||
|
942,
|
||||||
/**/
|
/**/
|
||||||
941,
|
941,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user