Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 7 Feb 2003 11:37:42 +0100
From:      Thomas Quinot <thomas@FreeBSD.ORG>
To:        Tim Robbins <tjr@FreeBSD.ORG>
Cc:        CHOI Junho <cjh@kr.FreeBSD.org>, current@FreeBSD.ORG, roberto@freebsd.org
Subject:   Re: 5.0 cron problem
Message-ID:  <20030207103742.GA61102@melusine.cuivre.fr.eu.org>
In-Reply-To: <20030205204250.A12276@dilbert.robbins.dropbear.id.au>
References:  <20030205.175730.55903839.cjh@kr.FreeBSD.org> <20030205204250.A12276@dilbert.robbins.dropbear.id.au>

next in thread | previous in thread | raw e-mail | index | archive | help
Le 2003-02-05, Tim Robbins écrivait :

> Since revision 1.11 of src/usr.sbin/cron/lib/env.c, you need to put the
> value of the environment variable inside quotes if it contains any spaces.
> I suspect that this change of behaviour was unintentional given that the
> implementation differs from the manual page. I'll investigate and fix
> it if it's a bug. In the mean time, use something like this instead:
> CVSUP="/usr/local/bin/cvsup -g -L2 -h localhost"

Right, the according to the man page inner whitespace in the unquoted
right-hand part of an environment variable assignment should be preserved.
Please try the following patch:

Index: lib/env.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/cron/lib/env.c,v
retrieving revision 1.11
diff -u -r1.11 env.c
--- lib/env.c	23 May 2002 13:16:30 -0000	1.11
+++ lib/env.c	7 Feb 2003 10:34:48 -0000
@@ -193,14 +193,16 @@
 					break;
 				}
 			} else {
-				if (isspace (*c)) {
-					state++;
-					c++;
-					break;
-				}
-				if (state == NAME && *c == '=') {
-					state++;
-					break;
+				if (state == NAME) {
+					if (isspace (*c)) {
+						c++;
+						state++;
+						break;
+					}
+					if (*c == '=') {
+						state++;
+						break;
+					}
 				}
 			}
 			*str++ = *c++;
@@ -232,9 +234,14 @@
 		Set_LineNum(fileline);
 		return (FALSE);
 	}
+	if (state == VALUE) {
+		/* End of unquoted value: trim trailing whitespace */
+		c = val + strlen (val);
+		while (c > val && isspace (*(c - 1)))
+			*(--c) = '\0';
+	}
 
-	/* 2 fields from parser; looks like an env setting
-	 */
+	/* 2 fields from parser; looks like an env setting */
 
 	if (strlen(name) + 1 + strlen(val) >= MAX_ENVSTR-1)
 		return (FALSE);

-- 
    Thomas.Quinot@Cuivre.FR.EU.ORG

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030207103742.GA61102>