changeset 997:69fbe949bcbf draft

As we now use times to trigger again instead of decreasing timers, ensure our lease fits. We may wish to revisit this again if we need decreasing timers once more.
author Roy Marples <roy@marples.name>
date Wed, 17 Sep 2008 13:09:30 +0000
parents 46cb7799f9d3
children 786b0f964829
files dhcp.c eloop.c
diffstat 2 files changed, 8 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/dhcp.c	Wed Sep 17 10:37:03 2008 +0000
+++ b/dhcp.c	Wed Sep 17 13:09:30 2008 +0000
@@ -1252,15 +1252,15 @@
 void
 get_lease(struct dhcp_lease *lease, const struct dhcp_message *dhcp)
 {
-	time_t t;
+	struct timeval now;
 
 	lease->addr.s_addr = dhcp->yiaddr;
 	if (get_option_addr(&lease->net.s_addr, dhcp, DHO_SUBNETMASK) == -1)
 		lease->net.s_addr = get_netmask(dhcp->yiaddr);
 	if (get_option_uint32(&lease->leasetime, dhcp, DHO_LEASETIME) == 0) {
 		/* Ensure that we can use the lease */
-		t = 0;
-		if (t + (time_t)lease->leasetime < t)
+		get_monotonic(&now);
+		if (now.tv_sec + (time_t)lease->leasetime < now.tv_sec)
 			lease->leasetime = ~0U; /* Infinite lease */
 	} else
 		lease->leasetime = DEFAULT_LEASETIME;
--- a/eloop.c	Wed Sep 17 10:37:03 2008 +0000
+++ b/eloop.c	Wed Sep 17 13:09:30 2008 +0000
@@ -117,6 +117,11 @@
 
 	get_monotonic(&now);
 	timeradd(&now, when, &w);
+	/* Check for time_t overflow. */
+	if (timercmp(&w, &now, <)) {
+		errno = ERANGE;
+		return;
+	}
 
 	/* Remove existing timeout if present */
 	for (t = timeouts; t; t = t->next) {