diff options
author | bfredl <bjorn.linse@gmail.com> | 2022-06-03 15:02:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-03 15:02:10 +0200 |
commit | dd0e9910da59bb870a95d6af9b82965eb42784d3 (patch) | |
tree | de91f39b6ae51ba8a8ba712ba1031d24575519a7 /src | |
parent | 69774e317982edbe943c7d75cb0369fc001dec39 (diff) | |
parent | 72644448732f9b598531460ade793d42ab08081e (diff) | |
download | rneovim-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
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/msgpack_rpc/unpacker.c | 15 |
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, |