aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2015-05-15 16:01:53 +0200
committerBjörn Linse <bjorn.linse@gmail.com>2015-05-19 16:21:01 +0200
commit5bbd182a3e02cf078e4bede693199c94943f4848 (patch)
treeccff071dbb29c15b1fde5f5e1b26489e9e999b91 /src
parent90fae3663f543e9573c4e69380cfcdcbc7bb34fc (diff)
downloadrneovim-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.c6
-rw-r--r--src/nvim/msgpack_rpc/helpers.c11
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,