]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/ra.c
Fix alignment of hash buffer in dhcpv6_response_is_valid
[odhcp6c.git] / src / ra.c
index dcb3e0f0fb40e9ee9281979ebf23435e52821254..dd5962a29e750dba87bd39c33664e8e531efc7d5 100644 (file)
--- a/src/ra.c
+++ b/src/ra.c
@@ -274,7 +274,8 @@ bool ra_process(void)
 {
        bool found = false;
        bool changed = false;
-       uint8_t buf[1500], cmsg_buf[128];
+       uint8_t buf[1500] __aligned(4);
+       uint8_t cmsg_buf[128] __aligned(__alignof__(struct cmsghdr));
        struct nd_router_advert *adv = (struct nd_router_advert*)buf;
        struct odhcp6c_entry *entry = alloca(sizeof(*entry) + 256);
        const struct in6_addr any = IN6ADDR_ANY_INIT;
@@ -424,14 +425,17 @@ bool ra_process(void)
 
                                while (buf < end) {
                                        int len = dn_expand(buf, end, buf, (char*)entry->auxtarget, 256);
-                                       if (len > 0) {
-                                               buf = &buf[len];
-                                               entry->auxlen = strlen((char*)entry->auxtarget);
-                                               changed |= odhcp6c_update_entry(STATE_RA_SEARCH, entry, 0, true);
-                                               entry->auxlen = 0;
-                                       } else {
+                                       if (len < 1)
                                                break;
-                                       }
+
+                                       buf = &buf[len];
+                                       entry->auxlen = strlen((char*)entry->auxtarget);
+
+                                       if (entry->auxlen == 0)
+                                               continue;
+
+                                       changed |= odhcp6c_update_entry(STATE_RA_SEARCH, entry, 0, true);
+                                       entry->auxlen = 0;
                                }
                        }
                }
@@ -441,8 +445,9 @@ bool ra_process(void)
                        size_t ra_dns_len;
                        uint8_t *start = odhcp6c_get_state(states[i], &ra_dns_len);
                        for (struct odhcp6c_entry *c = (struct odhcp6c_entry*)start;
-                                               (uint8_t*)c < &start[ra_dns_len] && &c->auxtarget[c->auxlen] <= &start[ra_dns_len];
-                                               c = (struct odhcp6c_entry*)(&c->auxtarget[c->auxlen]))
+                                               (uint8_t*)c < &start[ra_dns_len] &&
+                                               (uint8_t*)odhcp6c_next_entry(c) <= &start[ra_dns_len];
+                                               c = odhcp6c_next_entry(c))
                                if (IN6_ARE_ADDR_EQUAL(&c->router, &from.sin6_addr) &&
                                                c->valid > router_valid)
                                        c->valid = router_valid;