diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2015-05-15 16:01:53 +0200 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2015-05-19 16:21:01 +0200 |
commit | 5bbd182a3e02cf078e4bede693199c94943f4848 (patch) | |
tree | ccff071dbb29c15b1fde5f5e1b26489e9e999b91 /src | |
parent | 90fae3663f543e9573c4e69380cfcdcbc7bb34fc (diff) | |
download | rneovim-5bbd182a3e02cf078e4bede693199c94943f4848.tar.gz rneovim-5bbd182a3e02cf078e4bede693199c94943f4848.tar.bz2 rneovim-5bbd182a3e02cf078e4bede693199c94943f4848.zip |
msgpack-rpc: handle failure to convert method arguments #2664
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/msgpack_rpc/channel.c | 6 | ||||
-rw-r--r-- | src/nvim/msgpack_rpc/helpers.c | 11 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index b671b8b545..df78f822d6 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -464,7 +464,11 @@ static void handle_request(Channel *channel, msgpack_object *request) } Array args = ARRAY_DICT_INIT; - msgpack_rpc_to_array(msgpack_rpc_args(request), &args); + if (!msgpack_rpc_to_array(msgpack_rpc_args(request), &args)) { + handler.fn = msgpack_rpc_handle_invalid_arguments; + handler.defer = false; + } + bool defer = (!kv_size(channel->call_stack) && handler.defer); RequestEvent *event_data = xmalloc(sizeof(RequestEvent)); event_data->channel = channel; diff --git a/src/nvim/msgpack_rpc/helpers.c b/src/nvim/msgpack_rpc/helpers.c index 7d0db9a9b8..acfd3fe94f 100644 --- a/src/nvim/msgpack_rpc/helpers.c +++ b/src/nvim/msgpack_rpc/helpers.c @@ -306,6 +306,17 @@ Object msgpack_rpc_handle_missing_method(uint64_t channel_id, return NIL; } +/// Handler executed when malformated arguments are passed +Object msgpack_rpc_handle_invalid_arguments(uint64_t channel_id, + uint64_t request_id, + Array args, + Error *error) +{ + snprintf(error->msg, sizeof(error->msg), "Invalid method arguments"); + error->set = true; + return NIL; +} + /// Serializes a msgpack-rpc request or notification(id == 0) void msgpack_rpc_serialize_request(uint64_t request_id, String method, |