diff --git a/cmd-display-menu.c b/cmd-display-menu.c index d05c3ddc..3f26dba2 100644 --- a/cmd-display-menu.c +++ b/cmd-display-menu.c @@ -294,7 +294,7 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) const char *border_style = args_get(args, 'S'); const char *selected_style = args_get(args, 'H'); enum box_lines lines = BOX_LINES_DEFAULT; - char *title, *cause; + char *title, *cause = NULL; int flags = 0, starting_choice = 0; u_int px, py, i, count = args_count(args); struct options *o = target->s->curw->window->options; @@ -312,8 +312,7 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) &cause); if (cause != NULL) { cmdq_error(item, "starting choice %s", cause); - free(cause); - return (CMD_RETURN_ERROR); + goto fail; } } } @@ -334,8 +333,7 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) if (count - i < 2) { cmdq_error(item, "not enough arguments"); - menu_free(menu); - return (CMD_RETURN_ERROR); + goto fail; } key = args_string(args, i++); @@ -347,17 +345,13 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) } if (menu == NULL) { cmdq_error(item, "invalid menu arguments"); - return (CMD_RETURN_ERROR); - } - if (menu->count == 0) { - menu_free(menu); - return (CMD_RETURN_NORMAL); + goto fail; } + if (menu->count == 0) + goto out; if (!cmd_display_menu_get_pos(tc, item, args, &px, &py, menu->width + 4, - menu->count + 2)) { - menu_free(menu); - return (CMD_RETURN_NORMAL); - } + menu->count + 2)) + goto out; value = args_get(args, 'b'); if (value != NULL) { @@ -366,8 +360,7 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) &cause); if (lines == -1) { cmdq_error(item, "menu-border-lines %s", cause); - free(cause); - return (CMD_RETURN_ERROR); + goto fail; } } @@ -379,6 +372,15 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item) style, selected_style, border_style, target, NULL, NULL) != 0) return (CMD_RETURN_NORMAL); return (CMD_RETURN_WAIT); + +out: + menu_free(menu); + return (CMD_RETURN_NORMAL); + +fail: + free(cause); + menu_free(menu); + return (CMD_RETURN_ERROR); } static enum cmd_retval diff --git a/cmd-server-access.c b/cmd-server-access.c index b2b718b8..43cf4d5f 100644 --- a/cmd-server-access.c +++ b/cmd-server-access.c @@ -90,6 +90,7 @@ cmd_server_access_exec(struct cmd *self, struct cmdq_item *item) pw = getpwnam(name); if (pw == NULL) { cmdq_error(item, "unknown user: %s", name); + free(name); return (CMD_RETURN_ERROR); } free(name); diff --git a/cmd-show-prompt-history.c b/cmd-show-prompt-history.c index 1b95bcaf..5b88499c 100644 --- a/cmd-show-prompt-history.c +++ b/cmd-show-prompt-history.c @@ -60,6 +60,9 @@ cmd_show_prompt_history_exec(struct cmd *self, struct cmdq_item *item) if (cmd_get_entry(self) == &cmd_clear_prompt_history_entry) { if (typestr == NULL) { for (tidx = 0; tidx < PROMPT_NTYPES; tidx++) { + for (hidx = 0; hidx < status_prompt_hsize[tidx]; + hidx++) + free(status_prompt_hlist[tidx][hidx]); free(status_prompt_hlist[tidx]); status_prompt_hlist[tidx] = NULL; status_prompt_hsize[tidx] = 0; @@ -70,6 +73,8 @@ cmd_show_prompt_history_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "invalid type: %s", typestr); return (CMD_RETURN_ERROR); } + for (hidx = 0; hidx < status_prompt_hsize[type]; hidx++) + free(status_prompt_hlist[type][hidx]); free(status_prompt_hlist[type]); status_prompt_hlist[type] = NULL; status_prompt_hsize[type] = 0; diff --git a/menu.c b/menu.c index c458e68b..e4f79dec 100644 --- a/menu.c +++ b/menu.c @@ -161,6 +161,9 @@ menu_free(struct menu *menu) { u_int i; + if (menu == NULL) + return; + for (i = 0; i < menu->count; i++) { free((void *)menu->items[i].name); free((void *)menu->items[i].command); diff --git a/status.c b/status.c index edbb04ad..87d5e017 100644 --- a/status.c +++ b/status.c @@ -1890,7 +1890,7 @@ status_prompt_complete_window_menu(struct client *c, struct session *s, struct winlink *wl; char **list = NULL, *tmp; u_int lines = status_line_size(c), height; - u_int py, size = 0; + u_int py, size = 0, i; if (c->tty.sy - lines < 3) return (NULL); @@ -1969,6 +1969,9 @@ status_prompt_complete_window_menu(struct client *c, struct session *s, BOX_LINES_DEFAULT, NULL, NULL, NULL, NULL, status_prompt_menu_callback, spm) != 0) { menu_free(menu); + for (i = 0; i < size; i++) + free(list[i]); + free(list); free(spm); return (NULL); } diff --git a/tty-keys.c b/tty-keys.c index 7f9e8352..8fc51174 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -1389,7 +1389,7 @@ tty_keys_clipboard(struct tty *tty, const char *buf, size_t len, size_t *size) return (0); } out = xmalloc(needed); - if ((outlen = b64_pton(copy, out, len)) == -1) { + if ((outlen = b64_pton(copy, out, needed)) == -1) { free(out); free(copy); return (0);