diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-08-14 22:56:27 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-08-14 22:56:27 +0200 |
commit | 4fa1019f8026cb383423fb4086cba7e308591e18 (patch) | |
tree | 00fd6228014866c3eb81bc82c0d237b60447e039 /src/terminal.c | |
parent | 05fbfdcda48a564e7a778c67251f732481f3ceaa (diff) | |
download | vim-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)
Diffstat (limited to 'src/terminal.c')
-rw-r--r-- | src/terminal.c | 8 |
1 files changed, 6 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); } /* |