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;
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) {