From 23ad10c849bf6a89cfaf0c8f44a3297a3293eaff Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 23 Feb 2026 08:29:30 +0000 Subject: [PATCH 1/3] Set cell to default when off screen to avoid crash when logging it. --- tty-draw.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tty-draw.c b/tty-draw.c index eaf56d2b..fa9cbcd5 100644 --- a/tty-draw.c +++ b/tty-draw.c @@ -223,6 +223,7 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int px, u_int py, u_int nx, */ empty = 0; next_state = TTY_DRAW_LINE_DONE; + gcp = &grid_default_cell; } else { /* Get the current cell. */ grid_view_get_cell(gd, px + i, py, &gc); From 3094ca1da5cdc5bc0e4de0452404b2dc210b51bc Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 23 Feb 2026 08:45:27 +0000 Subject: [PATCH 2/3] Fix memory leaks, reported by Huihui Huang in GitHub issue 4872. --- cmd-display-menu.c | 44 ++++++++++++++++++++++++-------------------- environ.c | 3 +++ 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/cmd-display-menu.c b/cmd-display-menu.c index 894a2f68..fc9a99b6 100644 --- a/cmd-display-menu.c +++ b/cmd-display-menu.c @@ -394,7 +394,7 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) const char *style = args_get(args, 's'); const char *border_style = args_get(args, 'S'); char *cwd = NULL, *cause = NULL, **argv = NULL; - char *title; + char *title = NULL; int modify = popup_present(tc); int flags = -1, argc = 0; enum box_lines lines = BOX_LINES_DEFAULT; @@ -418,8 +418,7 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) &cause); if (cause != NULL) { cmdq_error(item, "height %s", cause); - free(cause); - return (CMD_RETURN_ERROR); + goto fail; } } @@ -429,8 +428,7 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) &cause); if (cause != NULL) { cmdq_error(item, "width %s", cause); - free(cause); - return (CMD_RETURN_ERROR); + goto fail; } } @@ -439,7 +437,7 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) if (h > tty->sy) h = tty->sy; if (!cmd_display_menu_get_pos(tc, item, args, &px, &py, w, h)) - return (CMD_RETURN_NORMAL); + goto out; value = args_get(args, 'd'); if (value != NULL) @@ -479,8 +477,7 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) &cause); if (cause != NULL) { cmdq_error(item, "popup-border-lines %s", cause); - free(cause); - return (CMD_RETURN_ERROR); + goto fail; } } @@ -508,22 +505,29 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) if (modify) { popup_modify(tc, title, style, border_style, lines, flags); - free(title); - return (CMD_RETURN_NORMAL); + goto out; } if (popup_display(flags, lines, item, px, py, w, h, env, shellcmd, argc, - argv, cwd, title, tc, s, style, border_style, NULL, NULL) != 0) { - cmd_free_argv(argc, argv); - if (env != NULL) - environ_free(env); - free(cwd); - free(title); - return (CMD_RETURN_NORMAL); - } - if (env != NULL) - environ_free(env); + argv, cwd, title, tc, s, style, border_style, NULL, NULL) != 0) + goto out; + environ_free(env); free(cwd); free(title); cmd_free_argv(argc, argv); return (CMD_RETURN_WAIT); + +out: + cmd_free_argv(argc, argv); + environ_free(env); + free(cwd); + free(title); + return (CMD_RETURN_NORMAL); + +fail: + free(cause); + cmd_free_argv(argc, argv); + environ_free(env); + free(cwd); + free(title); + return (CMD_RETURN_ERROR); } diff --git a/environ.c b/environ.c index 0b4b3c31..1e167b8a 100644 --- a/environ.c +++ b/environ.c @@ -57,6 +57,9 @@ environ_free(struct environ *env) { struct environ_entry *envent, *envent1; + if (env == NULL) + return; + RB_FOREACH_SAFE(envent, environ, env, envent1) { RB_REMOVE(environ, env, envent); free(envent->name); From 50a3b4c77799a3d3f409212443819f0edb23b59d Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 23 Feb 2026 08:46:57 +0000 Subject: [PATCH 3/3] Free format on -a, reported by Huihui Huang. --- cmd-display-message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd-display-message.c b/cmd-display-message.c index 9ba6d13e..3138d922 100644 --- a/cmd-display-message.c +++ b/cmd-display-message.c @@ -131,6 +131,7 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item) if (args_has(args, 'a')) { format_each(ft, cmd_display_message_each, item); + format_free(ft); return (CMD_RETURN_NORMAL); } @@ -155,6 +156,5 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item) free(msg); format_free(ft); - return (CMD_RETURN_NORMAL); }