diff options
author | oni-link <knil.ino@gmail.com> | 2015-02-12 14:07:05 +0100 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2015-04-03 08:03:25 -0300 |
commit | 12b084b62109e6dc43792fc4af5accb21b469d05 (patch) | |
tree | 4639b0a2622f956a5f37917a3a4457fc0f87859a /src | |
parent | db3ae72d1952cd93d5736c3ffd35eedcce0b5488 (diff) | |
download | rneovim-12b084b62109e6dc43792fc4af5accb21b469d05.tar.gz rneovim-12b084b62109e6dc43792fc4af5accb21b469d05.tar.bz2 rneovim-12b084b62109e6dc43792fc4af5accb21b469d05.zip |
Fix a memory leak for WBuffers used in channel_write().
channel_write() uses a ref-counted buffer for writing. This buffer
should be released if it was used in "refcount" channel_write() calls.
But calling channel_write() on a closed channel would return early and
not decrease the refcount of the used buffer.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/msgpack_rpc/channel.c | 1 | ||||
-rw-r--r-- | src/nvim/os/wstream.c | 6 |
2 files changed, 4 insertions, 3 deletions
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index ab67500fdc..35549ce042 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -495,6 +495,7 @@ static bool channel_write(Channel *channel, WBuffer *buffer) bool success; if (channel->closed) { + wstream_release_wbuffer(buffer); return false; } diff --git a/src/nvim/os/wstream.c b/src/nvim/os/wstream.c index 90d4ebeec8..13c6c0429f 100644 --- a/src/nvim/os/wstream.c +++ b/src/nvim/os/wstream.c @@ -181,7 +181,7 @@ bool wstream_write(WStream *wstream, WBuffer *buffer) return true; err: - release_wbuffer(buffer); + wstream_release_wbuffer(buffer); return false; } @@ -217,7 +217,7 @@ static void write_cb(uv_write_t *req, int status) data->wstream->curmem -= data->buffer->size; - release_wbuffer(data->buffer); + wstream_release_wbuffer(data->buffer); if (data->wstream->cb) { data->wstream->cb(data->wstream, @@ -239,7 +239,7 @@ static void write_cb(uv_write_t *req, int status) kmp_free(WRequestPool, wrequest_pool, data); } -static void release_wbuffer(WBuffer *buffer) +void wstream_release_wbuffer(WBuffer *buffer) { if (!--buffer->refcount) { if (buffer->cb) { |