Mercurial > vim
changeset 12403:b44bd42a374e v8.0.1081
patch 8.0.1081: memory leak for the channel write queue
commit https://github.com/vim/vim/commit/aba680a8513124e9556956115db4df35bd4a0e56
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Sep 9 16:42:53 2017 +0200
patch 8.0.1081: memory leak for the channel write queue
Problem: Memory leak for the channel write queue.
Solution: Free the write queue when clearing a channel.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 09 Sep 2017 16:45:05 +0200 |
parents | 67ab87d334e9 |
children | 8056f30dce80 |
files | src/channel.c src/version.c |
diffstat | 2 files changed, 24 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/channel.c +++ b/src/channel.c @@ -2930,14 +2930,26 @@ channel_close_in(channel_T *channel) ch_close_part(channel, PART_IN); } + static void +remove_from_writeque(writeq_T *wq, writeq_T *entry) +{ + ga_clear(&entry->wq_ga); + wq->wq_next = entry->wq_next; + if (wq->wq_next == NULL) + wq->wq_prev = NULL; + else + wq->wq_next->wq_prev = NULL; +} + /* * Clear the read buffer on "channel"/"part". */ static void channel_clear_one(channel_T *channel, ch_part_T part) { - jsonq_T *json_head = &channel->ch_part[part].ch_json_head; - cbq_T *cb_head = &channel->ch_part[part].ch_cb_head; + chanpart_T *ch_part = &channel->ch_part[part]; + jsonq_T *json_head = &ch_part->ch_json_head; + cbq_T *cb_head = &ch_part->ch_cb_head; while (channel_peek(channel, part) != NULL) vim_free(channel_get(channel, part)); @@ -2957,10 +2969,13 @@ channel_clear_one(channel_T *channel, ch remove_json_node(json_head, json_head->jq_next); } - free_callback(channel->ch_part[part].ch_callback, - channel->ch_part[part].ch_partial); - channel->ch_part[part].ch_callback = NULL; - channel->ch_part[part].ch_partial = NULL; + free_callback(ch_part->ch_callback, ch_part->ch_partial); + ch_part->ch_callback = NULL; + ch_part->ch_partial = NULL; + + while (ch_part->ch_writeque.wq_next != NULL) + remove_from_writeque(&ch_part->ch_writeque, + ch_part->ch_writeque.wq_next); } /* @@ -3719,12 +3734,7 @@ channel_send( if (entry != NULL) { /* Remove the entry from the write queue. */ - ga_clear(&entry->wq_ga); - wq->wq_next = entry->wq_next; - if (wq->wq_next == NULL) - wq->wq_prev = NULL; - else - wq->wq_next->wq_prev = NULL; + remove_from_writeque(wq, entry); continue; } if (did_use_queue)