]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/dhcpv6.c
Add better overflow safety in resend
[odhcp6c.git] / src / dhcpv6.c
index cfa5a407f1408f2d6d03a452121fac9e16ee66c3..64c0cb44e90107b184590d6d265e03286c09c8c6 100644 (file)
@@ -350,14 +350,14 @@ static int64_t dhcpv6_rand_delay(int64_t time)
 {
        int random;
        odhcp6c_random(&random, sizeof(random));
-       return (time * (random % 1000)) / 10000;
+       return (time * ((int64_t)random % 1000LL)) / 10000LL;
 }
 
 
 int dhcpv6_request(enum dhcpv6_msg type)
 {
        uint8_t buf[1536];
-       uint32_t timeout = UINT32_MAX;
+       uint64_t timeout = UINT32_MAX;
        struct dhcpv6_retx *retx = &dhcpv6_retx[type];
 
        if (retx->delay) {
@@ -371,14 +371,14 @@ int dhcpv6_request(enum dhcpv6_msg type)
        else if (type == DHCPV6_MSG_UNKNOWN)
                timeout = t1;
        else if (type == DHCPV6_MSG_RENEW)
-               timeout = t2 - t1;
+               timeout = (t2 > t1) ? t2 - t1 : 0;
        else if (type == DHCPV6_MSG_REBIND)
-               timeout = t3 - t2;
+               timeout = (t3 > t2) ? t3 - t2 : 0;
 
        if (timeout == 0)
                return -1;
 
-       syslog(LOG_NOTICE, "Sending %s (timeout %us)", retx->name, timeout);
+       syslog(LOG_NOTICE, "Sending %s (timeout %us)", retx->name, (unsigned)timeout);
 
        uint64_t start = odhcp6c_get_milli_time(), round_start = start, elapsed;
 
@@ -726,29 +726,23 @@ static int dhcpv6_handle_reply(enum dhcpv6_msg orig,
                        if (error)
                                continue;
 
-                       // Update times
-                       if (l_t1 > 0 && t1 > l_t1)
-                               t1 = l_t1;
-
-                       if (l_t2 > 0 && t2 > l_t2)
-                               t2 = l_t2;
-
                        uint32_t n = dhcpv6_parse_ia(&ia_hdr[1], odata + olen);
 
-                       if (n < t1)
-                               t1 = n;
+                       if (!l_t1)
+                               l_t1 = 300;
 
-                       if (n < t2)
-                               t2 = n;
+                       if (!l_t2)
+                               l_t2 = 600;
 
                        if (n < t3)
                                t3 = n;
 
-                       if (t2 >= t3)
-                               t2 = 8 * t3 / 10;
+                       // Update times
+                       if (l_t1 > 0 && t1 > l_t1)
+                               t1 = l_t1;
 
-                       if (t1 >= t2)
-                               t1 = 5 * t2 / 8;
+                       if (l_t2 > 0 && t2 > l_t2)
+                               t2 = l_t2;
 
                } else if (otype == DHCPV6_OPT_DNS_SERVERS) {
                        if (olen % 16 == 0)