summaryrefslogtreecommitdiff
path: root/usr.bin/cvs
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 /usr.bin/cvs
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!)
Diffstat (limited to 'usr.bin/cvs')
-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]);
}