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) { 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);
} }

View File

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

View File

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