X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=src%2Fra.c;h=dd5962a29e750dba87bd39c33664e8e531efc7d5;hb=HEAD;hp=dcb3e0f0fb40e9ee9281979ebf23435e52821254;hpb=19c64c524614ea7fdbcedcc50d6980f096ccadb9;p=odhcp6c.git diff --git a/src/ra.c b/src/ra.c index dcb3e0f..dd5962a 100644 --- 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;