0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 7.4.1261

Problem:    Pending channel messages are garbage collected. Leaking memory in
            ch_sendexpr().  Leaking memory for a decoded JSON string.
Solution:   Mark the message list as used. Free the encoded JSON.  Don't save
            the JSON string.
This commit is contained in:
Bram Moolenaar
2016-02-04 22:49:49 +01:00
parent a8343c1808
commit 4b6a6dcbe7
5 changed files with 34 additions and 4 deletions

View File

@@ -1315,4 +1315,29 @@ channel_parse_messages(void)
return ret; return ret;
} }
int
set_ref_in_channel(int copyID)
{
int i;
int abort = FALSE;
for (i = 0; i < channel_count; ++i)
{
jsonq_T *head = &channels[i].ch_json_head;
jsonq_T *item = head->next;
while (item != head)
{
list_T *l = item->value->vval.v_list;
if (l->lv_copyID != copyID)
{
l->lv_copyID = copyID;
abort = abort || set_ref_in_list(l, copyID, NULL);
}
item = item->next;
}
}
return abort;
}
#endif /* FEAT_CHANNEL */ #endif /* FEAT_CHANNEL */

View File

@@ -6855,6 +6855,10 @@ garbage_collect(void)
abort = abort || set_ref_in_python3(copyID); abort = abort || set_ref_in_python3(copyID);
#endif #endif
#ifdef FEAT_CHANNEL
abort = abort || set_ref_in_channel(copyID);
#endif
if (!abort) if (!abort)
{ {
/* /*
@@ -9842,6 +9846,7 @@ f_ch_sendexpr(typval_T *argvars, typval_T *rettv)
return; return;
ch_idx = send_common(argvars, text, "sendexpr"); ch_idx = send_common(argvars, text, "sendexpr");
vim_free(text);
if (ch_idx >= 0) if (ch_idx >= 0)
{ {
if (channel_read_json_block(ch_idx, id, &listtv) == OK) if (channel_read_json_block(ch_idx, id, &listtv) == OK)

View File

@@ -533,10 +533,7 @@ json_decode_string(js_read_T *reader, typval_T *res)
if (res != NULL) if (res != NULL)
{ {
res->v_type = VAR_STRING; res->v_type = VAR_STRING;
if (ga.ga_data == NULL) res->vval.v_string = ga.ga_data;
res->vval.v_string = NULL;
else
res->vval.v_string = vim_strsave(ga.ga_data);
} }
return OK; return OK;
} }

View File

@@ -22,4 +22,5 @@ int channel_poll_check(int ret_in, void *fds_in);
int channel_select_setup(int maxfd_in, void *rfds_in); int channel_select_setup(int maxfd_in, void *rfds_in);
int channel_select_check(int ret_in, void *rfds_in); int channel_select_check(int ret_in, void *rfds_in);
int channel_parse_messages(void); int channel_parse_messages(void);
int set_ref_in_channel(int copyID);
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@@ -742,6 +742,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 */
/**/
1261,
/**/ /**/
1260, 1260,
/**/ /**/