{
bool found = false;
bool changed = false;
- uint8_t buf[1500], cmsg_buf[128];
+ uint8_t buf[1500] _aligned(4);
+ union {
+ struct cmsghdr hdr;
+ uint8_t buf[CMSG_SPACE(sizeof(int))];
+ } cmsg_buf;
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;
.msg_namelen = sizeof(from),
.msg_iov = &iov,
.msg_iovlen = 1,
- .msg_control = cmsg_buf,
+ .msg_control = cmsg_buf.buf,
.msg_controllen = sizeof(cmsg_buf),
.msg_flags = 0
};
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;
}
}
}
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;