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:
@@ -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 */
|
||||||
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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 : */
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user