diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2017-04-22 06:13:31 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2017-04-22 06:13:31 +0000 |
commit | 7dacec96629ca9cf12bfbb31ffcec3d881b74045 (patch) | |
tree | 43559f016d711a5f94b7c194c63275f4744ed548 /usr.bin/tmux/cmd-set-option.c | |
parent | dad77f0ade2df22ab8afa6eddc7ff3d6f9d53883 (diff) |
Memory leaks, from David CARLIER.
Diffstat (limited to 'usr.bin/tmux/cmd-set-option.c')
-rw-r--r-- | usr.bin/tmux/cmd-set-option.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/usr.bin/tmux/cmd-set-option.c b/usr.bin/tmux/cmd-set-option.c index c544e26a6d9..02f8b2a6860 100644 --- a/usr.bin/tmux/cmd-set-option.c +++ b/usr.bin/tmux/cmd-set-option.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-set-option.c,v 1.112 2017/02/16 10:53:25 nicm Exp $ */ +/* $OpenBSD: cmd-set-option.c,v 1.113 2017/04/22 06:13:30 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -77,7 +77,8 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) enum options_table_scope scope; struct options *oo; struct options_entry *parent, *o; - const char *name, *value, *target; + char *name; + const char *value, *target; int window, idx, already, error, ambiguous; char *cause; @@ -121,7 +122,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) return (CMD_RETURN_NORMAL); cmdq_error(item, "%s", cause); free(cause); - return (CMD_RETURN_ERROR); + goto fail; } /* Which table should this option go into? */ @@ -136,7 +137,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "no such session: %s", target); else cmdq_error(item, "no current session"); - return (CMD_RETURN_ERROR); + goto fail; } else oo = s->options; } else if (scope == OPTIONS_TABLE_WINDOW) { @@ -148,7 +149,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "no such window: %s", target); else cmdq_error(item, "no current window"); - return (CMD_RETURN_ERROR); + goto fail; } else oo = wl->window->options; } @@ -159,7 +160,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) if (idx != -1) { if (*name == '@' || options_array_size(parent, NULL) == -1) { cmdq_error(item, "not an array: %s", args->argv[0]); - return (CMD_RETURN_ERROR); + goto fail; } } @@ -177,14 +178,14 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) if (args_has(args, 'q')) return (CMD_RETURN_NORMAL); cmdq_error(item, "already set: %s", args->argv[0]); - return (CMD_RETURN_ERROR); + goto fail; } } /* Change the option. */ if (args_has(args, 'u')) { if (o == NULL) - return (CMD_RETURN_NORMAL); + goto fail; if (idx == -1) { if (oo == global_options || oo == global_s_options || @@ -197,17 +198,17 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) } else if (*name == '@') { if (value == NULL) { cmdq_error(item, "empty value"); - return (CMD_RETURN_ERROR); + goto fail; } options_set_string(oo, name, append, "%s", value); } else if (idx == -1 && options_array_size(parent, NULL) == -1) { error = cmd_set_option_set(self, item, oo, parent, value); if (error != 0) - return (CMD_RETURN_ERROR); + goto fail; } else { if (value == NULL) { cmdq_error(item, "empty value"); - return (CMD_RETURN_ERROR); + goto fail; } if (o == NULL) o = options_empty(oo, options_table_entry(parent)); @@ -217,7 +218,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) options_array_assign(o, value); } else if (options_array_set(o, idx, value, append) != 0) { cmdq_error(item, "invalid index: %s", args->argv[0]); - return (CMD_RETURN_ERROR); + goto fail; } } @@ -261,7 +262,12 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) server_redraw_client(c); } + free(name); return (CMD_RETURN_NORMAL); + +fail: + free(name); + return (CMD_RETURN_ERROR); } static int |