aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/msgpack_rpc/unpacker.c
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2024-04-17 19:12:52 +0200
committerGitHub <noreply@github.com>2024-04-17 19:12:52 +0200
commit6488a9268a6352de63fa90233e259ad8f31b44af (patch)
tree709fd51149721f0f8913d8988c5361fc98f6e25f /src/nvim/msgpack_rpc/unpacker.c
parentb0f9228179bf781eec76d1aaf346b56a7e64cd5d (diff)
parent60d1e3e4718abccbe117f20a49233e7e85ad2a79 (diff)
downloadrneovim-6488a9268a6352de63fa90233e259ad8f31b44af.tar.gz
rneovim-6488a9268a6352de63fa90233e259ad8f31b44af.tar.bz2
rneovim-6488a9268a6352de63fa90233e259ad8f31b44af.zip
Merge pull request #28355 from theofabilous/msgpack-crash-fix
fix(msgpack): retain grid line event memory
Diffstat (limited to 'src/nvim/msgpack_rpc/unpacker.c')
-rw-r--r--src/nvim/msgpack_rpc/unpacker.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/src/nvim/msgpack_rpc/unpacker.c b/src/nvim/msgpack_rpc/unpacker.c
index dbb30b0c9a..28d27e8268 100644
--- a/src/nvim/msgpack_rpc/unpacker.c
+++ b/src/nvim/msgpack_rpc/unpacker.c
@@ -187,6 +187,8 @@ void unpacker_init(Unpacker *p)
p->unpack_error = ERROR_INIT;
p->arena = (Arena)ARENA_EMPTY;
+
+ p->has_grid_line_event = false;
}
void unpacker_teardown(Unpacker *p)
@@ -303,6 +305,7 @@ error:
bool unpacker_advance(Unpacker *p)
{
assert(p->state >= 0);
+ p->has_grid_line_event = false;
if (p->state == 0) {
if (!unpacker_parse_header(p)) {
return false;
@@ -323,6 +326,7 @@ bool unpacker_advance(Unpacker *p)
if (p->state == 16) {
// grid_line event already unpacked
+ p->has_grid_line_event = true;
goto done;
} else {
assert(p->state == 12);
@@ -378,7 +382,7 @@ bool unpacker_parse_redraw(Unpacker *p)
const char *data = p->read_ptr;
size_t size = p->read_size;
- GridLineEvent *g = p->grid_line_event;
+ GridLineEvent *g = &p->grid_line_event;
#define NEXT_TYPE(tok, typ) \
result = mpack_rtoken(&data, &size, &tok); \
@@ -420,16 +424,10 @@ bool unpacker_parse_redraw(Unpacker *p)
p->read_size = size;
if (p->ui_handler.fn != ui_client_event_grid_line) {
p->state = 12;
- if (p->grid_line_event) {
- arena_mem_free(arena_finish(&p->arena));
- p->grid_line_event = NULL;
- }
return true;
} else {
p->state = 14;
p->arena = (Arena)ARENA_EMPTY;
- p->grid_line_event = arena_alloc(&p->arena, sizeof *p->grid_line_event, true);
- g = p->grid_line_event;
}
FALLTHROUGH;