summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-08-14 22:56:27 +0200
committerBram Moolenaar <Bram@vim.org>2017-08-14 22:56:27 +0200
commit4fa1019f8026cb383423fb4086cba7e308591e18 (patch)
tree00fd6228014866c3eb81bc82c0d237b60447e039
parent05fbfdcda48a564e7a778c67251f732481f3ceaa (diff)
downloadvim-4fa1019f8026cb383423fb4086cba7e308591e18.zip
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)
-rw-r--r--src/terminal.c8
-rw-r--r--src/version.c2
2 files changed, 8 insertions, 2 deletions
diff --git a/src/terminal.c b/src/terminal.c
index d4a45fb8c..149679e3f 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -392,7 +392,8 @@ term_start(typval_T *argvar, jobopt_T *opt, int forceit)
setup_job_options(opt, term->tl_rows, term->tl_cols);
/* 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. */
vterm_get_size(term->tl_vterm, &term->tl_rows, &term->tl_cols);
@@ -434,6 +435,7 @@ ex_terminal(exarg_T *eap)
typval_T argvar;
jobopt_T opt;
char_u *cmd;
+ char_u *tofree = NULL;
init_job_options(&opt);
@@ -462,7 +464,8 @@ ex_terminal(exarg_T *eap)
cmd = skipwhite(p);
}
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)
{
@@ -480,6 +483,7 @@ ex_terminal(exarg_T *eap)
argvar.v_type = VAR_STRING;
argvar.vval.v_string = cmd;
term_start(&argvar, &opt, eap->forceit);
+ vim_free(tofree);
}
/*
diff --git a/src/version.c b/src/version.c
index d4617b0fd..263b00492 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 942,
+/**/
941,
/**/
940,