fix(rpc): ignore redraw events when exiting (#22184)

When a TUI client has already stopped, handling UI events will cause a
heap-use-after-free, so ignore them.
This commit is contained in:
zeertzjq 2023-02-09 14:36:17 +08:00 committed by GitHub
parent ecc40660d1
commit b2b82ff142
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 1 deletions

View File

@ -247,7 +247,8 @@ static void parse_msgpack(Channel *channel)
Unpacker *p = channel->rpc.unpacker;
while (unpacker_advance(p)) {
if (p->type == kMessageTypeRedrawEvent) {
if (ui_client_channel_id) {
// 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);
} else if (p->ui_handler.fn != NULL && p->result.type == kObjectTypeArray) {

View File

@ -2407,6 +2407,11 @@ describe("TUI as a client", function()
{3:-- TERMINAL --} |
]]}
-- No heap-use-after-free when receiving UI events after deadly signal #22184
server:request('nvim_input', ('a'):rep(1000))
exec_lua([[vim.loop.kill(vim.fn.jobpid(vim.bo.channel), 'sigterm')]])
screen:expect({any = '%[Process exited 1%]'})
client_super:close()
server:close()
end)