diff options
author | Jack Danger Canty <jackdanger@squareup.com> | 2015-01-19 12:37:21 -0800 |
---|---|---|
committer | Jack Danger Canty <jackdanger@squareup.com> | 2015-01-22 00:17:42 -0800 |
commit | 1a090983f53453069487426fcd6dff9c817bb70f (patch) | |
tree | 6df806b7a5d3d81b050c82136414cc872fee5364 | |
parent | d550eecf7092397d064df26850d4a09d9ab4a481 (diff) | |
download | rneovim-1a090983f53453069487426fcd6dff9c817bb70f.tar.gz rneovim-1a090983f53453069487426fcd6dff9c817bb70f.tar.bz2 rneovim-1a090983f53453069487426fcd6dff9c817bb70f.zip |
Fix CID #102150
Don't attempt to write an error message to a channel that may have been
closed and freed.
[CID #102150](https://scan8.coverity.com/reports.htm#v22612/p10672/fileInstanceId=3625286&defectInstanceId=1525721&mergedDefectId=102150)
-rw-r--r-- | src/nvim/msgpack_rpc/channel.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index c8f8252e6d..920274f850 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -442,17 +442,18 @@ static void handle_request(Channel *channel, msgpack_object *request) if (error.set) { // Validation failed, send response with error - channel_write(channel, - serialize_response(channel->id, - request_id, - &error, - NIL, - &out_buffer)); - char buf[256]; - snprintf(buf, sizeof(buf), - "Channel %" PRIu64 " sent an invalid message, closing.", - channel->id); - call_set_error(channel, buf); + if (channel_write(channel, + serialize_response(channel->id, + request_id, + &error, + NIL, + &out_buffer))) { + char buf[256]; + snprintf(buf, sizeof(buf), + "Channel %" PRIu64 " sent an invalid message, closing.", + channel->id); + call_set_error(channel, buf); + } return; } @@ -619,8 +620,7 @@ static void unsubscribe(Channel *channel, char *event) free(event_string); } -/// Close the channel streams/job. The channel resources will be freed by -/// free_channel later. +/// Close the channel streams/job and free the channel resources. static void close_channel(Channel *channel) { if (channel->closed) { |