From e86752820993a00e3d28350cbe46878ba95d9012 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 24 Aug 2022 07:22:30 +0000 Subject: Check for NULL returns from bufferevent_new. --- window.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'window.c') diff --git a/window.c b/window.c index 2be5d5e6..1b0066c2 100644 --- a/window.c +++ b/window.c @@ -1033,6 +1033,8 @@ window_pane_set_event(struct window_pane *wp) wp->event = bufferevent_new(wp->fd, window_pane_read_callback, NULL, window_pane_error_callback, wp); + if (wp->event == NULL) + fatalx("out of memory"); wp->ictx = input_init(wp, wp->event, &wp->palette); bufferevent_enable(wp->event, EV_READ|EV_WRITE); -- cgit From 09afc6c8ee971918d925c441c41a9de7f598efb7 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 6 Jan 2023 07:09:27 +0000 Subject: If a pane is killed, cancel reading from the file. GitHub issue 3422. --- window.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'window.c') diff --git a/window.c b/window.c index 1b0066c2..4929383e 100644 --- a/window.c +++ b/window.c @@ -66,6 +66,7 @@ static u_int next_active_point; struct window_pane_input_data { struct cmdq_item *item; u_int wp; + struct client_file *file; }; static struct window_pane *window_pane_create(struct window *, u_int, u_int, @@ -1533,18 +1534,16 @@ window_pane_input_callback(struct client *c, __unused const char *path, size_t len = EVBUFFER_LENGTH(buffer); wp = window_pane_find_by_id(cdata->wp); - if (wp == NULL || closed || error != 0 || (c->flags & CLIENT_DEAD)) { + if (cdata->file != NULL && (wp == NULL || c->flags & CLIENT_DEAD)) { if (wp == NULL) c->flags |= CLIENT_EXIT; - - evbuffer_drain(buffer, len); + file_cancel(cdata->file); + } else if (cdata->file == NULL || closed || error != 0) { cmdq_continue(cdata->item); - server_client_unref(c); free(cdata); - return; - } - input_parse_buffer(wp, buf, len); + } else + input_parse_buffer(wp, buf, len); evbuffer_drain(buffer, len); } @@ -1567,9 +1566,8 @@ window_pane_start_input(struct window_pane *wp, struct cmdq_item *item, cdata = xmalloc(sizeof *cdata); cdata->item = item; cdata->wp = wp->id; - + cdata->file = file_read(c, "-", window_pane_input_callback, cdata); c->references++; - file_read(c, "-", window_pane_input_callback, cdata); return (0); } -- cgit From 7c0789d2d2721b70e04fe6a589f644797d2b5e1f Mon Sep 17 00:00:00 2001 From: nicm Date: Sun, 8 Jan 2023 22:17:04 +0000 Subject: Have client return 1 if process is interrupted to an input pane. --- window.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'window.c') diff --git a/window.c b/window.c index 4929383e..0fd71c74 100644 --- a/window.c +++ b/window.c @@ -1535,8 +1535,10 @@ window_pane_input_callback(struct client *c, __unused const char *path, wp = window_pane_find_by_id(cdata->wp); if (cdata->file != NULL && (wp == NULL || c->flags & CLIENT_DEAD)) { - if (wp == NULL) + if (wp == NULL) { + c->retval = 1; c->flags |= CLIENT_EXIT; + } file_cancel(cdata->file); } else if (cdata->file == NULL || closed || error != 0) { cmdq_continue(cdata->item); -- cgit