aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2022-06-03 15:02:10 +0200
committerGitHub <noreply@github.com>2022-06-03 15:02:10 +0200
commitdd0e9910da59bb870a95d6af9b82965eb42784d3 (patch)
treede91f39b6ae51ba8a8ba712ba1031d24575519a7
parent69774e317982edbe943c7d75cb0369fc001dec39 (diff)
parent72644448732f9b598531460ade793d42ab08081e (diff)
downloadrneovim-dd0e9910da59bb870a95d6af9b82965eb42784d3.tar.gz
rneovim-dd0e9910da59bb870a95d6af9b82965eb42784d3.tar.bz2
rneovim-dd0e9910da59bb870a95d6af9b82965eb42784d3.zip
Merge pull request #18846 from bfredl/unpackfix
fix(api): some robustness issues in api_parse_enter
-rw-r--r--src/nvim/msgpack_rpc/unpacker.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/nvim/msgpack_rpc/unpacker.c b/src/nvim/msgpack_rpc/unpacker.c
index 9db8f314bf..e60d9f220f 100644
--- a/src/nvim/msgpack_rpc/unpacker.c
+++ b/src/nvim/msgpack_rpc/unpacker.c
@@ -50,15 +50,23 @@ static void api_parse_enter(mpack_parser_t *parser, mpack_node_t *node)
Object *obj = parent->data[0].p;
KeyValuePair *kv = &kv_A(obj->data.dictionary, parent->pos);
if (!parent->key_visited) {
+ // TODO(bfredl): when implementing interrupt parse on error,
+ // stop parsing here when node is not a STR/BIN
+ kv->key = (String)STRING_INIT;
key_location = &kv->key;
- } else {
- result = &kv->value;
}
+ result = &kv->value;
break;
}
- default:
+ case MPACK_TOKEN_STR:
+ case MPACK_TOKEN_BIN:
+ case MPACK_TOKEN_EXT:
+ assert(node->tok.type == MPACK_TOKEN_CHUNK);
break;
+
+ default:
+ abort();
}
} else {
result = &unpacker->result;
@@ -99,6 +107,7 @@ static void api_parse_enter(mpack_parser_t *parser, mpack_node_t *node)
break;
case MPACK_TOKEN_CHUNK:
+ assert(parent);
if (parent->tok.type == MPACK_TOKEN_STR || parent->tok.type == MPACK_TOKEN_BIN) {
char *data = parent->data[0].p;
memcpy(data + parent->pos,