File 0021-dhcp-4.x.x-fixed-improper-lease-duration-checking.patch of Package dhcp.24175

From: Marius Tomaschewski <mt@suse.de> 
Date: Tue, 12 Jan 2016 15:42:22 +0100    
Subject: [PATCH] fixed improper lease duration checking. 
References: bsc#936923, bsc#880984

year 2038 is EOT only for 32 bit machine. This patch checks 
wordsize and do a proper EOT checking on lease duration. It  
also fixes integer overflows in the date and time handling code.

diff --git a/common/parse.c b/common/parse.c
index 22e7d58..e9e53a4 100644
--- a/common/parse.c
+++ b/common/parse.c
@@ -939,7 +939,7 @@ TIME
 parse_date_core(cfile)
 	struct parse *cfile;
 {
-	int guess;
+	long guess;
 	int tzoff, year, mon, mday, hour, min, sec;
 	const char *val;
 	enum dhcp_token token;
@@ -966,7 +966,7 @@ parse_date_core(cfile)
 		}
 
 		skip_token(&val, NULL, cfile); /* consume number */
-		guess = atoi(val);
+		guess = atol(val);
 
 		return((TIME)guess);
 	}
@@ -1113,11 +1113,22 @@ parse_date_core(cfile)
 	 * overflow issues.  We could try and be more precise but there
 	 * doesn't seem to be a good reason to worry about it and waste
 	 * the cpu looking at the rest of the date. */
-	if (year >= 138)
-		return(MAX_TIME);
-
+	if (sizeof(time_t) == 8) {
+		/* 2038 is not an issue on 64bit. time calculations
+		 * start to fail at almost INT_MAX (- some guard) */
+		if (year > 0x7fff0000)
+			return(MAX_TIME);
+	} else {
+		/* assume 32bit with end in 2038 */
+		if (year >= 138)
+			return(MAX_TIME);
+	}
+	/* I don't think we need to care about lease starts before 1900 */
+	if (year < 0)
+		return((TIME)0);
+ 
 	/* Guess the time value... */
-	guess = ((((((365 * (year - 70) +	/* Days in years since '70 */
+	guess = ((((((365 * ((long)year - 70) +	/* Days in years since '70 */
 		      (year - 69) / 4 +		/* Leap days since '70 */
 		      (mon			/* Days in months this year */
 		       ? months [mon - 1]
diff --git a/includes/dhcpd.h b/includes/dhcpd.h
index 4270edc..1af4c5b 100644
--- a/includes/dhcpd.h
+++ b/includes/dhcpd.h
@@ -1561,7 +1561,7 @@ typedef unsigned char option_mask [16];
 #define DHCPD_LOG_FACILITY	LOG_DAEMON
 #endif
 
-#define MAX_TIME 0x7fffffff
+#define MAX_TIME LONG_MAX
 #define MIN_TIME 0
 
 #ifdef USE_LOG_PID
openSUSE Build Service is sponsored by