neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit ecc40660d1577835245d99f95e14762a30d36054
parent ffd216e869fd7c18b9f608173c929500e26fe070
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Thu,  9 Feb 2023 10:53:47 +0800

fix(rpc): ignore redraw events when not in UI client (#21892)

Otherwise it will crash.
Diffstat:
Msrc/nvim/msgpack_rpc/channel.c | 10++++++----
Mtest/functional/api/server_requests_spec.lua | 15+++++++++++++++
2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c @@ -247,10 +247,12 @@ static void parse_msgpack(Channel *channel) Unpacker *p = channel->rpc.unpacker; while (unpacker_advance(p)) { if (p->type == kMessageTypeRedrawEvent) { - 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) { - p->ui_handler.fn(p->result.data.array); + if (ui_client_channel_id) { + 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) { + p->ui_handler.fn(p->result.data.array); + } } arena_mem_free(arena_finish(&p->arena)); } else if (p->type == kMessageTypeResponse) { diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua @@ -337,6 +337,21 @@ describe('server -> client', function() eq('localhost:', string.sub(address,1,10)) connect_test(server, 'tcp', address) end) + + it('does not crash on receiving UI events', function() + local server = spawn(nvim_argv) + set_session(server) + local address = funcs.serverlist()[1] + local client = spawn(nvim_argv, false, nil, true) + set_session(client) + + local id = funcs.sockconnect('pipe', address, {rpc=true}) + funcs.rpcrequest(id, 'nvim_ui_attach', 80, 24, {}) + assert_alive() + + server:close() + client:close() + end) end) describe('connecting to its own pipe address', function()