summaryrefslogtreecommitdiff
path: root/src/channel.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-09-04 20:44:42 +0200
committerBram Moolenaar <Bram@vim.org>2016-09-04 20:44:42 +0200
commitc8fe338d64cc6183c03d4c12b1e036a7745e2932 (patch)
tree6eb770c301aa439c78d928806bbb003306a53769 /src/channel.c
parentd5824ce1b5491df7d2eb0b66189d366fa67b4585 (diff)
downloadvim-git-c8fe338d64cc6183c03d4c12b1e036a7745e2932.tar.gz
patch 7.4.2327v7.4.2327
Problem: Freeing a variable that is on the stack. Solution: Don't free res_tv or err_tv. (Ozaki Kiichi)
Diffstat (limited to 'src/channel.c')
-rw-r--r--src/channel.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/src/channel.c b/src/channel.c
index bbe98be1b..10ed42e6b 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -2142,7 +2142,7 @@ channel_exe_cmd(channel_T *channel, int part, typval_T *argv)
}
else
{
- typval_T *tv;
+ typval_T *tv = NULL;
typval_T res_tv;
typval_T err_tv;
char_u *json = NULL;
@@ -2159,8 +2159,6 @@ channel_exe_cmd(channel_T *channel, int part, typval_T *argv)
ch_logs(channel, "Calling '%s'", (char *)arg);
if (func_call(arg, &argv[2], NULL, NULL, &res_tv) == OK)
tv = &res_tv;
- else
- tv = NULL;
}
if (argv[id_idx].v_type == VAR_NUMBER)
@@ -2174,11 +2172,9 @@ channel_exe_cmd(channel_T *channel, int part, typval_T *argv)
/* If evaluation failed or the result can't be encoded
* then return the string "ERROR". */
vim_free(json);
- free_tv(tv);
err_tv.v_type = VAR_STRING;
err_tv.vval.v_string = (char_u *)"ERROR";
- tv = &err_tv;
- json = json_encode_nr_expr(id, tv, options | JSON_NL);
+ json = json_encode_nr_expr(id, &err_tv, options | JSON_NL);
}
if (json != NULL)
{
@@ -2191,7 +2187,7 @@ channel_exe_cmd(channel_T *channel, int part, typval_T *argv)
--emsg_skip;
if (tv == &res_tv)
clear_tv(tv);
- else if (tv != &err_tv)
+ else
free_tv(tv);
}
}