5a3797e
diff -up dhcp-4.2.0/common/parse.c.parse_date dhcp-4.2.0/common/parse.c
5a3797e
--- dhcp-4.2.0/common/parse.c.parse_date	2010-07-21 16:11:36.000000000 +0200
5a3797e
+++ dhcp-4.2.0/common/parse.c	2010-07-21 16:23:10.000000000 +0200
5f19ed1
@@ -913,48 +913,46 @@ parse_date_core(cfile)
5f19ed1
 					  212, 243, 273, 304, 334 };
5f19ed1
 
5f19ed1
 	/* Day of week, or "never"... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token == NEVER) {
5f19ed1
-		if (!parse_semi (cfile))
5f19ed1
-			return 0;
5f19ed1
+		next_token (&val, (unsigned *)0, cfile); /* consume NEVER*/
5f19ed1
 		return MAX_TIME;
5f19ed1
 	}
5f19ed1
 
5f19ed1
 	/* This indicates 'local' time format. */
5f19ed1
 	if (token == EPOCH) {
5f19ed1
-		token = next_token(&val, NULL, cfile);
5f19ed1
-
5f19ed1
+		next_token(&val, (unsigned *)0, cfile); /* consume EPOCH */
5f19ed1
+		token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 		if (token != NUMBER) {
5f19ed1
 			parse_warn(cfile, "Seconds since epoch expected.");
5f19ed1
 			if (token != SEMI)
5f19ed1
-				skip_to_semi(cfile);
5f19ed1
+				next_token(&val, (unsigned *)0, cfile);
5f19ed1
 			return (TIME)0;
5f19ed1
 		}
5f19ed1
+		next_token(&val, (unsigned *)0, cfile); /* consume seconds */
5f19ed1
 
63aa3f4
 		guess = atol(val);
5f19ed1
-
5f19ed1
-		if (!parse_semi(cfile))
5f19ed1
-			return (TIME)0;
5f19ed1
-
5f19ed1
 		return guess;
5f19ed1
 	}
5f19ed1
 
5f19ed1
 	if (token != NUMBER) {
5f19ed1
 		parse_warn (cfile, "numeric day of week expected.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume day of week */
63aa3f4
 	wday = atol (val);
5f19ed1
 
5f19ed1
 	/* Year... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != NUMBER) {
5f19ed1
 		parse_warn (cfile, "numeric year expected.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume Year*/
5f19ed1
 
5f19ed1
 	/* Note: the following is not a Y2K bug - it's a Y1.9K bug.   Until
5f19ed1
 	   somebody invents a time machine, I think we can safely disregard
5f19ed1
@@ -965,101 +963,113 @@ parse_date_core(cfile)
5f19ed1
 		year -= 1900;
5f19ed1
 
5f19ed1
 	/* Slash separating year from month... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != SLASH) {
5f19ed1
 		parse_warn (cfile,
5f19ed1
 			    "expected slash separating year from month.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	token = next_token(&val, (unsigned *)0, cfile); /* consume SLASH */
5f19ed1
 
5f19ed1
 	/* Month... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != NUMBER) {
5f19ed1
 		parse_warn (cfile, "numeric month expected.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume Month */
63aa3f4
 	mon = atol (val) - 1;
5f19ed1
 
5f19ed1
 	/* Slash separating month from day... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != SLASH) {
5f19ed1
 		parse_warn (cfile,
5f19ed1
 			    "expected slash separating month from day.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume SLASH */
5f19ed1
 
5f19ed1
 	/* Day of month... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != NUMBER) {
5f19ed1
 		parse_warn (cfile, "numeric day of month expected.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume Day of month */
63aa3f4
 	mday = atol (val);
5f19ed1
 
5f19ed1
 	/* Hour... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != NUMBER) {
5f19ed1
 		parse_warn (cfile, "numeric hour expected.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume Hour */
63aa3f4
 	hour = atol (val);
5f19ed1
 
5f19ed1
 	/* Colon separating hour from minute... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != COLON) {
5f19ed1
 		parse_warn (cfile,
5f19ed1
 			    "expected colon separating hour from minute.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume Colon */
5f19ed1
 
5f19ed1
 	/* Minute... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != NUMBER) {
5f19ed1
 		parse_warn (cfile, "numeric minute expected.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume Minute */
63aa3f4
 	min = atol (val);
5f19ed1
 
5f19ed1
 	/* Colon separating minute from second... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != COLON) {
5f19ed1
 		parse_warn (cfile,
5f19ed1
 			    "expected colon separating minute from second.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume Colon */
5f19ed1
 
5f19ed1
 	/* Second... */
5f19ed1
-	token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token != NUMBER) {
5f19ed1
 		parse_warn (cfile, "numeric second expected.");
5f19ed1
 		if (token != SEMI)
5f19ed1
-			skip_to_semi (cfile);
5f19ed1
+			next_token(&val, (unsigned *)0, cfile);
5f19ed1
 		return (TIME)0;
5f19ed1
 	}
5f19ed1
+	next_token(&val, (unsigned *)0, cfile); /* consume Second */
63aa3f4
 	sec = atol (val);
5f19ed1
 
5f19ed1
+	tzoff = 0;
5f19ed1
 	token = peek_token (&val, (unsigned *)0, cfile);
5f19ed1
 	if (token == NUMBER) {
5f19ed1
-		token = next_token (&val, (unsigned *)0, cfile);
5f19ed1
+		next_token (&val, (unsigned *)0, cfile); /* consume tzoff */
63aa3f4
 		tzoff = atol (val);
5f19ed1
-	} else
5f19ed1
-		tzoff = 0;
5f19ed1
+	} else if (token != SEMI) {
5f19ed1
+		parse_warn (cfile, "Time zone offset or semicolon expected.");
5f19ed1
+		next_token (&val, (unsigned *)0, cfile);
5f19ed1
+	}
5f19ed1
 
5f19ed1
 	/* Guess the time value... */
5f19ed1
 	guess = ((((((365 * (year - 70) +	/* Days in years since '70 */
5f19ed1
@@ -1095,7 +1105,7 @@ parse_date(cfile)
5f19ed1
 
5f19ed1
        /* Make sure the date ends in a semicolon... */
5f19ed1
        if (!parse_semi(cfile))
5f19ed1
-               return 0;
5f19ed1
+               return (TIME)0;
5f19ed1
        return guess;
5f19ed1
 }
5f19ed1