aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/msgpack_rpc
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-02-09 14:36:17 +0800
committerGitHub <noreply@github.com>2023-02-09 14:36:17 +0800
commitb2b82ff14281a4784790af288cde13984d5d5727 (patch)
treec2ef45236fe7311eae8c32cd8cee58be7a590763 /src/nvim/msgpack_rpc
parentecc40660d1577835245d99f95e14762a30d36054 (diff)
downloadrneovim-b2b82ff14281a4784790af288cde13984d5d5727.tar.gz
rneovim-b2b82ff14281a4784790af288cde13984d5d5727.tar.bz2
rneovim-b2b82ff14281a4784790af288cde13984d5d5727.zip
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.
Diffstat (limited to 'src/nvim/msgpack_rpc')
-rw-r--r--src/nvim/msgpack_rpc/channel.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c
index 193c88646a..34c8f89e3f 100644
--- a/src/nvim/msgpack_rpc/channel.c
+++ b/src/nvim/msgpack_rpc/channel.c
@@ -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) {