aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/context.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-11-11 10:21:14 +0800
committerGitHub <noreply@github.com>2023-11-11 10:21:14 +0800
commite9b9a86cd5a555943b87f0ba40c4527561c3c124 (patch)
treeb1f2aef3e5e68053a8d2f08206b2c61083e6f6c1 /src/nvim/context.c
parentd1b2a5cf5fa583b556457d34a46ce7b940913a66 (diff)
downloadrneovim-e9b9a86cd5a555943b87f0ba40c4527561c3c124.tar.gz
rneovim-e9b9a86cd5a555943b87f0ba40c4527561c3c124.tar.bz2
rneovim-e9b9a86cd5a555943b87f0ba40c4527561c3c124.zip
fix(context): don't crash on invalid arg to nvim_get_context (#25977)
Note: The crash happens in the second test case when using uninitialized memory, and therefore doesn't happen with ASAN.
Diffstat (limited to 'src/nvim/context.c')
-rw-r--r--src/nvim/context.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/nvim/context.c b/src/nvim/context.c
index 9b1eee56c5..f7ed800aa7 100644
--- a/src/nvim/context.c
+++ b/src/nvim/context.c
@@ -321,24 +321,28 @@ static inline Array sbuf_to_array(msgpack_sbuffer sbuf)
/// Convert readfile()-style array to msgpack_sbuffer.
///
/// @param[in] array readfile()-style array to convert.
+/// @param[out] err Error object.
///
/// @return msgpack_sbuffer with conversion result.
-static inline msgpack_sbuffer array_to_sbuf(Array array)
+static inline msgpack_sbuffer array_to_sbuf(Array array, Error *err)
+ FUNC_ATTR_NONNULL_ALL
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
typval_T list_tv;
- Error err = ERROR_INIT;
- (void)object_to_vim(ARRAY_OBJ(array), &list_tv, &err);
+ if (!object_to_vim(ARRAY_OBJ(array), &list_tv, err)) {
+ return sbuf;
+ }
+ assert(list_tv.v_type == VAR_LIST);
if (!encode_vim_list_to_buf(list_tv.vval.v_list, &sbuf.size, &sbuf.data)) {
- emsg(_("E474: Failed to convert list to msgpack string buffer"));
+ api_set_error(err, kErrorTypeException, "%s",
+ "E474: Failed to convert list to msgpack string buffer");
}
sbuf.alloc = sbuf.size;
tv_clear(&list_tv);
- api_clear_error(&err);
return sbuf;
}
@@ -367,9 +371,10 @@ Dictionary ctx_to_dict(Context *ctx)
///
/// @param[in] dict Context Dictionary representation.
/// @param[out] ctx Context object to store conversion result into.
+/// @param[out] err Error object.
///
/// @return types of included context items.
-int ctx_from_dict(Dictionary dict, Context *ctx)
+int ctx_from_dict(Dictionary dict, Context *ctx, Error *err)
FUNC_ATTR_NONNULL_ALL
{
assert(ctx != NULL);
@@ -382,16 +387,16 @@ int ctx_from_dict(Dictionary dict, Context *ctx)
}
if (strequal(item.key.data, "regs")) {
types |= kCtxRegs;
- ctx->regs = array_to_sbuf(item.value.data.array);
+ ctx->regs = array_to_sbuf(item.value.data.array, err);
} else if (strequal(item.key.data, "jumps")) {
types |= kCtxJumps;
- ctx->jumps = array_to_sbuf(item.value.data.array);
+ ctx->jumps = array_to_sbuf(item.value.data.array, err);
} else if (strequal(item.key.data, "bufs")) {
types |= kCtxBufs;
- ctx->bufs = array_to_sbuf(item.value.data.array);
+ ctx->bufs = array_to_sbuf(item.value.data.array, err);
} else if (strequal(item.key.data, "gvars")) {
types |= kCtxGVars;
- ctx->gvars = array_to_sbuf(item.value.data.array);
+ ctx->gvars = array_to_sbuf(item.value.data.array, err);
} else if (strequal(item.key.data, "funcs")) {
types |= kCtxFuncs;
ctx->funcs = copy_object(item.value, NULL).data.array;