summaryrefslogtreecommitdiffstats
path: root/cmd-string.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-11-11 18:56:07 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-11-11 18:56:07 +0000
commit89763f2ace93af48ca98a9fb19d92eb1eeac792c (patch)
treeac13c49edf17fccb946162f16d822ce697840b15 /cmd-string.c
parent9df4e7597d86160f747bdbaa6bce043bf81fdb1f (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").
Diffstat (limited to 'cmd-string.c')
-rw-r--r--cmd-string.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/cmd-string.c b/cmd-string.c
index 06f01a54..7af34fb0 100644
--- a/cmd-string.c
+++ b/cmd-string.c
@@ -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);
}