summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2009-11-13 16:55:10 +0000
committerTiago Cunha <tcunha@gmx.com>2009-11-13 16:55:10 +0000
commitba832ff2c39f581543167cb6050cd003de31fee0 (patch)
treeba150ee936f34f733a48b81642e971f56b2e51aa
parent2ec5aca064f297e97c2d0bd9d8a481d157f83ebe (diff)
Sync OpenBSD patchset 530:
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--cmd-string.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/cmd-string.c b/cmd-string.c
index 13fb6c76..69cc9b6e 100644
--- a/cmd-string.c
+++ b/cmd-string.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-string.c,v 1.24 2009-10-28 23:12:38 tcunha Exp $ */
+/* $Id: cmd-string.c,v 1.25 2009-11-13 16:55:10 tcunha 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);
}