summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2009-11-11 18:56:08 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2009-11-11 18:56:08 +0000
commit87a0de9387337052d86de8725c4c2640ea149b48 (patch)
treeec6a9fafaa022f0b23ed2b4247c552750c4ec70a
parent6e8405e8a9388cdea761cf81c4a1ac6f64603a1b (diff)
Rewrite a confusing loop when freeing the arg array on exit and move the check
for argv being NULL, prompted by parfait via deraadt. Also fix some definite brokenness when assigning multiple environment variables in arguments (such as "X=1 Y=2").
-rw-r--r--usr.bin/tmux/cmd-string.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/usr.bin/tmux/cmd-string.c b/usr.bin/tmux/cmd-string.c
index 19f43e1d2ef..a2f4e01bdaa 100644
--- a/usr.bin/tmux/cmd-string.c
+++ b/usr.bin/tmux/cmd-string.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-string.c,v 1.7 2009/10/26 21:42:04 deraadt Exp $ */
+/* $OpenBSD: cmd-string.c,v 1.8 2009/11/11 18:56:07 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -134,17 +134,15 @@ cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause)
if (ch != EOF)
break;
- if (argc == 0)
- goto out;
- for (i = 0; i < argc; i++) {
- equals = strchr(argv[i], '=');
- whitespace = argv[i] + strcspn(argv[i], " \t");
+ while (argc != 0) {
+ equals = strchr(argv[0], '=');
+ whitespace = argv[0] + strcspn(argv[0], " \t");
if (equals == NULL || equals > whitespace)
break;
- environ_put(&global_environ, argv[i]);
- memmove(&argv[i], &argv[i + 1], argc - i - 1);
+ environ_put(&global_environ, argv[0]);
argc--;
+ memmove(argv, argv + 1, argc * (sizeof *argv));
}
if (argc == 0)
goto out;
@@ -189,10 +187,11 @@ out:
if (buf != NULL)
xfree(buf);
- while (--argc >= 0)
- xfree(argv[argc]);
- if (argv != NULL)
+ if (argv != NULL) {
+ for (i = 0; i < argc; i++)
+ xfree(argv[argc]);
xfree(argv);
+ }
return (rval);
}