summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Francois Brousseau <jfb@cvs.openbsd.org>2004-12-06 21:13:50 +0000
committerJean-Francois Brousseau <jfb@cvs.openbsd.org>2004-12-06 21:13:50 +0000
commitf9cb54a7a4bb2711c0d028cc82fb05770fb11e0f (patch)
treef3c4f1f8e831504e19f16eb934e291457b6b9ce1
parentff9bafeb0d201ee9eff719dedd6a13b355b27931 (diff)
reorder some of the code for argument vector splitting so we don't
overflow the array and we don't produce weird results if the last character of the line is an escape character (bogus!)
-rw-r--r--usr.bin/cvs/util.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/usr.bin/cvs/util.c b/usr.bin/cvs/util.c
index 949d882ec45..aef655f1960 100644
--- a/usr.bin/cvs/util.c
+++ b/usr.bin/cvs/util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: util.c,v 1.15 2004/12/06 21:03:13 deraadt Exp $ */
+/* $OpenBSD: util.c,v 1.16 2004/12/06 21:13:49 jfb Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -393,12 +393,13 @@ cvs_getargv(const char *line, char **argv, int argvlen)
i = 0;
memset(qbuf, 0, sizeof(qbuf));
while (*lp != '"') {
+ if (*lp == '\\')
+ lp++;
if (*lp == '\0') {
cvs_log(LP_ERR, "no terminating quote");
err++;
break;
- } else if (*lp == '\\')
- lp++;
+ }
qbuf[i++] = *lp++;
if (i == sizeof(qbuf)) {
@@ -418,6 +419,11 @@ cvs_getargv(const char *line, char **argv, int argvlen)
arg = cp;
}
+ if (argc == argvlen) {
+ err++;
+ break;
+ }
+
argv[argc] = strdup(arg);
if (argv[argc] == NULL) {
cvs_log(LP_ERRNO, "failed to copy argument");
@@ -450,7 +456,8 @@ cvs_freeargv(char **argv, int argc)
int i;
for (i = 0; i < argc; i++)
- free(argv[i]);
+ if (argv[i] != NULL)
+ free(argv[i]);
}