Fix logic inversion
[project/odhcpd.git] / src / dhcpv6-ia.c
index f850b02..7e8e535 100644 (file)
@@ -219,7 +219,7 @@ void dhcpv6_write_statefile(void)
                        return;
 
                lockf(fd, F_LOCK, 0);
                        return;
 
                lockf(fd, F_LOCK, 0);
-               ftruncate(fd, 0);
+               if (ftruncate(fd, 0) < 0) {}
 
                FILE *fp = fdopen(fd, "w");
                if (!fp) {
 
                FILE *fp = fdopen(fd, "w");
                if (!fp) {
@@ -264,7 +264,8 @@ void dhcpv6_write_statefile(void)
 
                                        for (size_t i = 0; i < addrlen; ++i) {
                                                if (addrs[i].prefix > 96 || c->valid_until <= now ||
 
                                        for (size_t i = 0; i < addrlen; ++i) {
                                                if (addrs[i].prefix > 96 || c->valid_until <= now ||
-                                                               (iface->managed < RELAYD_MANAGED_NO_AFLAG && i != m))
+                                                               (iface->managed < RELAYD_MANAGED_NO_AFLAG && i != m &&
+                                                                               addrs[i].prefix == 64))
                                                        continue;
 
                                                addr = addrs[i].addr;
                                                        continue;
 
                                                addr = addrs[i].addr;
@@ -595,7 +596,10 @@ static void update(struct interface *iface)
        }
 
        struct dhcpv6_assignment *border = list_last_entry(&iface->ia_assignments, struct dhcpv6_assignment, head);
        }
 
        struct dhcpv6_assignment *border = list_last_entry(&iface->ia_assignments, struct dhcpv6_assignment, head);
-       border->assigned = 1 << (64 - minprefix);
+       if (minprefix > 32 && minprefix <= 64)
+               border->assigned = 1U << (64 - minprefix);
+       else
+               border->assigned = 0;
 
        bool change = len != (int)iface->ia_addr_len;
        for (int i = 0; !change && i < len; ++i)
 
        bool change = len != (int)iface->ia_addr_len;
        for (int i = 0; !change && i < len; ++i)
@@ -727,13 +731,19 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
                                        m = i;
 
                        for (size_t i = 0; i < addrlen; ++i) {
                                        m = i;
 
                        for (size_t i = 0; i < addrlen; ++i) {
-                               uint32_t prefix_pref = addrs[i].preferred - now;
-                               uint32_t prefix_valid = addrs[i].valid - now;
+                               uint32_t prefix_pref = addrs[i].preferred;
+                               uint32_t prefix_valid = addrs[i].valid;
 
                                if (addrs[i].prefix > 96 ||
                                                addrs[i].preferred <= (uint32_t)now)
                                        continue;
 
 
                                if (addrs[i].prefix > 96 ||
                                                addrs[i].preferred <= (uint32_t)now)
                                        continue;
 
+                               if (prefix_pref != UINT32_MAX)
+                                       prefix_pref -= now;
+
+                               if (prefix_valid != UINT32_MAX)
+                                       prefix_valid -= now;
+
                                if (a->length < 128) {
                                        struct dhcpv6_ia_prefix p = {
                                                .type = htons(DHCPV6_OPT_IA_PREFIX),
                                if (a->length < 128) {
                                        struct dhcpv6_ia_prefix p = {
                                                .type = htons(DHCPV6_OPT_IA_PREFIX),
@@ -764,7 +774,8 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
                                        n.addr.s6_addr32[3] = htonl(a->assigned);
                                        size_t entrlen = sizeof(n) - 4;
 
                                        n.addr.s6_addr32[3] = htonl(a->assigned);
                                        size_t entrlen = sizeof(n) - 4;
 
-                                       if (iface->managed < RELAYD_MANAGED_NO_AFLAG && i != m)
+                                       if (iface->managed < RELAYD_MANAGED_NO_AFLAG && i != m &&
+                                                       addrs[i].prefix == 64)
                                                continue;
 
                                        if (datalen + entrlen + 4 > buflen || a->assigned == 0)
                                                continue;
 
                                        if (datalen + entrlen + 4 > buflen || a->assigned == 0)