mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #28355 from theofabilous/msgpack-crash-fix
fix(msgpack): retain grid line event memory
This commit is contained in:
commit
6488a9268a
@ -289,8 +289,9 @@ static void parse_msgpack(Channel *channel)
|
|||||||
if (p->type == kMessageTypeRedrawEvent) {
|
if (p->type == kMessageTypeRedrawEvent) {
|
||||||
// When exiting, ui_client_stop() has already been called, so don't handle UI events.
|
// When exiting, ui_client_stop() has already been called, so don't handle UI events.
|
||||||
if (ui_client_channel_id && !exiting) {
|
if (ui_client_channel_id && !exiting) {
|
||||||
if (p->grid_line_event) {
|
if (p->has_grid_line_event) {
|
||||||
ui_client_event_raw_line(p->grid_line_event);
|
ui_client_event_raw_line(&p->grid_line_event);
|
||||||
|
p->has_grid_line_event = false;
|
||||||
} else if (p->ui_handler.fn != NULL && p->result.type == kObjectTypeArray) {
|
} else if (p->ui_handler.fn != NULL && p->result.type == kObjectTypeArray) {
|
||||||
p->ui_handler.fn(p->result.data.array);
|
p->ui_handler.fn(p->result.data.array);
|
||||||
}
|
}
|
||||||
|
@ -187,6 +187,8 @@ void unpacker_init(Unpacker *p)
|
|||||||
p->unpack_error = ERROR_INIT;
|
p->unpack_error = ERROR_INIT;
|
||||||
|
|
||||||
p->arena = (Arena)ARENA_EMPTY;
|
p->arena = (Arena)ARENA_EMPTY;
|
||||||
|
|
||||||
|
p->has_grid_line_event = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void unpacker_teardown(Unpacker *p)
|
void unpacker_teardown(Unpacker *p)
|
||||||
@ -303,6 +305,7 @@ error:
|
|||||||
bool unpacker_advance(Unpacker *p)
|
bool unpacker_advance(Unpacker *p)
|
||||||
{
|
{
|
||||||
assert(p->state >= 0);
|
assert(p->state >= 0);
|
||||||
|
p->has_grid_line_event = false;
|
||||||
if (p->state == 0) {
|
if (p->state == 0) {
|
||||||
if (!unpacker_parse_header(p)) {
|
if (!unpacker_parse_header(p)) {
|
||||||
return false;
|
return false;
|
||||||
@ -323,6 +326,7 @@ bool unpacker_advance(Unpacker *p)
|
|||||||
|
|
||||||
if (p->state == 16) {
|
if (p->state == 16) {
|
||||||
// grid_line event already unpacked
|
// grid_line event already unpacked
|
||||||
|
p->has_grid_line_event = true;
|
||||||
goto done;
|
goto done;
|
||||||
} else {
|
} else {
|
||||||
assert(p->state == 12);
|
assert(p->state == 12);
|
||||||
@ -378,7 +382,7 @@ bool unpacker_parse_redraw(Unpacker *p)
|
|||||||
|
|
||||||
const char *data = p->read_ptr;
|
const char *data = p->read_ptr;
|
||||||
size_t size = p->read_size;
|
size_t size = p->read_size;
|
||||||
GridLineEvent *g = p->grid_line_event;
|
GridLineEvent *g = &p->grid_line_event;
|
||||||
|
|
||||||
#define NEXT_TYPE(tok, typ) \
|
#define NEXT_TYPE(tok, typ) \
|
||||||
result = mpack_rtoken(&data, &size, &tok); \
|
result = mpack_rtoken(&data, &size, &tok); \
|
||||||
@ -420,16 +424,10 @@ bool unpacker_parse_redraw(Unpacker *p)
|
|||||||
p->read_size = size;
|
p->read_size = size;
|
||||||
if (p->ui_handler.fn != ui_client_event_grid_line) {
|
if (p->ui_handler.fn != ui_client_event_grid_line) {
|
||||||
p->state = 12;
|
p->state = 12;
|
||||||
if (p->grid_line_event) {
|
|
||||||
arena_mem_free(arena_finish(&p->arena));
|
|
||||||
p->grid_line_event = NULL;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
p->state = 14;
|
p->state = 14;
|
||||||
p->arena = (Arena)ARENA_EMPTY;
|
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;
|
FALLTHROUGH;
|
||||||
|
|
||||||
|
@ -37,7 +37,8 @@ struct Unpacker {
|
|||||||
int nevents;
|
int nevents;
|
||||||
int ncalls;
|
int ncalls;
|
||||||
UIClientHandler ui_handler;
|
UIClientHandler ui_handler;
|
||||||
GridLineEvent *grid_line_event;
|
GridLineEvent grid_line_event;
|
||||||
|
bool has_grid_line_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
// unrecovareble error. unpack_error should be set!
|
// unrecovareble error. unpack_error should be set!
|
||||||
|
Loading…
Reference in New Issue
Block a user