0
0
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:
Bram Moolenaar
2017-08-14 22:56:27 +02:00
parent 05fbfdcda4
commit 4fa1019f80
2 changed files with 8 additions and 2 deletions

View File

@@ -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);
} }
/* /*

View File

@@ -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,
/**/ /**/