]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/dhcpv6.c
Fix calculation of preferred and valid times
[odhcp6c.git] / src / dhcpv6.c
index a3d4223404688dc9234be1753b7e3ccc2f4b9919..28fad507b4a4fa39e541c01f1e6091bed255f491 100644 (file)
@@ -614,20 +614,24 @@ static int dhcpv6_handle_reply(_unused enum dhcpv6_msg orig,
        dhcpv6_for_each_option(ia_pd, ia_pd + ia_pd_len, otype, olen, odata) {
                struct dhcpv6_ia_prefix *p = (void*)&odata[-4];
                uint32_t valid = ntohl(p->valid);
-               p->valid = (valid < elapsed) ? 0 : htonl(valid - elapsed);
+               if (valid != UINT32_MAX)
+                       p->valid = (valid < elapsed) ? 0 : htonl(valid - elapsed);
 
                uint32_t pref = ntohl(p->preferred);
-               p->preferred = (pref < elapsed) ? 0 : htonl(pref - elapsed);
+               if (pref != UINT32_MAX)
+                       p->preferred = (pref < elapsed) ? 0 : htonl(pref - elapsed);
        }
 
        // Decrease valid and preferred lifetime of addresses
        dhcpv6_for_each_option(ia_na, ia_na + ia_na_len, otype, olen, odata) {
                struct dhcpv6_ia_addr *p = (void*)&odata[-4];
                uint32_t valid = ntohl(p->valid);
-               p->valid = (valid < elapsed) ? 0 : htonl(valid - elapsed);
+               if (valid != UINT32_MAX)
+                       p->valid = (valid < elapsed) ? 0 : htonl(valid - elapsed);
 
                uint32_t pref = ntohl(p->preferred);
-               p->preferred = (pref < elapsed) ? 0 : htonl(pref - elapsed);
+               if (pref != UINT32_MAX)
+                       p->preferred = (pref < elapsed) ? 0 : htonl(pref - elapsed);
        }
 
        // Parse and find all matching IAs
@@ -675,7 +679,7 @@ static int dhcpv6_handle_reply(_unused enum dhcpv6_msg orig,
                                t3 = n;
 
                } else if (otype == DHCPV6_OPT_DNS_SERVERS) {
-                       if (olen == 16)
+                       if (olen % 16 == 0)
                                odhcp6c_add_state(STATE_DNS, odata, olen);
                } else if (otype == DHCPV6_OPT_DNS_DOMAIN) {
                        odhcp6c_add_state(STATE_SEARCH, odata, olen);