Merge pull request #28355 from theofabilous/msgpack-crash-fix

fix(msgpack): retain grid line event memory
This commit is contained in:
bfredl 2024-04-17 19:12:52 +02:00 committed by GitHub
commit 6488a9268a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 10 additions and 10 deletions

View File

@ -289,8 +289,9 @@ static void parse_msgpack(Channel *channel)
if (p->type == kMessageTypeRedrawEvent) {
// When exiting, ui_client_stop() has already been called, so don't handle UI events.
if (ui_client_channel_id && !exiting) {
if (p->grid_line_event) {
ui_client_event_raw_line(p->grid_line_event);
if (p->has_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) {
p->ui_handler.fn(p->result.data.array);
}

View File

@ -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;

View File

@ -37,7 +37,8 @@ struct Unpacker {
int nevents;
int ncalls;
UIClientHandler ui_handler;
GridLineEvent *grid_line_event;
GridLineEvent grid_line_event;
bool has_grid_line_event;
};
// unrecovareble error. unpack_error should be set!