diff --git a/cmd-display-menu.c b/cmd-display-menu.c index 3d8bed93..d05c3ddc 100644 --- a/cmd-display-menu.c +++ b/cmd-display-menu.c @@ -393,7 +393,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; @@ -417,8 +417,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; } } @@ -428,8 +427,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; } } @@ -438,7 +436,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) @@ -478,8 +476,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; } } @@ -507,22 +504,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/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); } diff --git a/environ.c b/environ.c index 039d3a4a..68e0417b 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); 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);