diff options
author | 2010-10-29 20:11:57 +0000 | |
---|---|---|
committer | 2010-10-29 20:11:57 +0000 | |
commit | a0c8ba6113313039a5b9eef35fd3ce374fd97ef5 (patch) | |
tree | 525a1d477c610dc0638e1f3572621b37af2369e1 | |
parent | sync (diff) | |
download | wireguard-openbsd-a0c8ba6113313039a5b9eef35fd3ce374fd97ef5.tar.xz wireguard-openbsd-a0c8ba6113313039a5b9eef35fd3ce374fd97ef5.zip |
We now send argv to the server after parsing it in the client to get the
command, so the client should not modify it. Instead, take a copy. Fixes
parsing command lists, reported by mcbride@.
-rw-r--r-- | usr.bin/tmux/cmd-list.c | 22 | ||||
-rw-r--r-- | usr.bin/tmux/cmd.c | 18 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.h | 3 |
3 files changed, 32 insertions, 11 deletions
diff --git a/usr.bin/tmux/cmd-list.c b/usr.bin/tmux/cmd-list.c index f3de5d77730..674b5c0998e 100644 --- a/usr.bin/tmux/cmd-list.c +++ b/usr.bin/tmux/cmd-list.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-list.c,v 1.5 2010/06/26 18:20:53 nicm Exp $ */ +/* $OpenBSD: cmd-list.c,v 1.6 2010/10/29 20:11:57 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> @@ -29,7 +29,9 @@ cmd_list_parse(int argc, char **argv, char **cause) struct cmd *cmd; int i, lastsplit; size_t arglen, new_argc; - char **new_argv; + char **copy_argv, **new_argv; + + copy_argv = cmd_copy_argv(argc, argv); cmdlist = xmalloc(sizeof *cmdlist); cmdlist->references = 1; @@ -37,18 +39,18 @@ cmd_list_parse(int argc, char **argv, char **cause) lastsplit = 0; for (i = 0; i < argc; i++) { - arglen = strlen(argv[i]); - if (arglen == 0 || argv[i][arglen - 1] != ';') + arglen = strlen(copy_argv[i]); + if (arglen == 0 || copy_argv[i][arglen - 1] != ';') continue; - argv[i][arglen - 1] = '\0'; + copy_argv[i][arglen - 1] = '\0'; - if (arglen > 1 && argv[i][arglen - 2] == '\\') { - argv[i][arglen - 2] = ';'; + if (arglen > 1 && copy_argv[i][arglen - 2] == '\\') { + copy_argv[i][arglen - 2] = ';'; continue; } new_argc = i - lastsplit; - new_argv = argv + lastsplit; + new_argv = copy_argv + lastsplit; if (arglen != 1) new_argc++; @@ -61,16 +63,18 @@ cmd_list_parse(int argc, char **argv, char **cause) } if (lastsplit != argc) { - cmd = cmd_parse(argc - lastsplit, argv + lastsplit, cause); + cmd = cmd_parse(argc - lastsplit, copy_argv + lastsplit, cause); if (cmd == NULL) goto bad; TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry); } + cmd_free_argv(argc, copy_argv); return (cmdlist); bad: cmd_list_free(cmdlist); + cmd_free_argv(argc, copy_argv); return (NULL); } diff --git a/usr.bin/tmux/cmd.c b/usr.bin/tmux/cmd.c index 280dd9cffd6..b4fa4dbccc2 100644 --- a/usr.bin/tmux/cmd.c +++ b/usr.bin/tmux/cmd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd.c,v 1.45 2010/10/23 13:04:34 nicm Exp $ */ +/* $OpenBSD: cmd.c,v 1.46 2010/10/29 20:11:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -166,6 +166,22 @@ cmd_unpack_argv(char *buf, size_t len, int argc, char ***argv) return (0); } +char ** +cmd_copy_argv(int argc, char **argv) +{ + char **new_argv; + int i; + + if (argc == 0) + return (NULL); + new_argv = xcalloc(argc, sizeof *new_argv); + for (i = 0; i < argc; i++) { + if (argv[i] != NULL) + new_argv[i] = xstrdup(argv[i]); + } + return (new_argv); +} + void cmd_free_argv(int argc, char **argv) { diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 35bd23b8b18..9ff5082c29b 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.244 2010/10/23 13:04:34 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.245 2010/10/29 20:11:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -1464,6 +1464,7 @@ const char *cmd_set_option_print( /* cmd.c */ int cmd_pack_argv(int, char **, char *, size_t); int cmd_unpack_argv(char *, size_t, int, char ***); +char **cmd_copy_argv(int, char **); void cmd_free_argv(int, char **); struct cmd *cmd_parse(int, char **, char **); int cmd_exec(struct cmd *, struct cmd_ctx *); |