From 8a8005f7ca8973702b36e711993bfff89ca9600c Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Thu, 28 Jan 2016 04:33:48 +0000 Subject: Add padding between odhcp6c_entry structures to ensure 32-bit alignment struct odhcp6c_entry is not declared as __packed, so the compiler may assume it is naturally aligned. Signed-off-by: Ben Hutchings --- src/ra.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/ra.c') diff --git a/src/ra.c b/src/ra.c index 1c121e6..2d442f6 100644 --- a/src/ra.c +++ b/src/ra.c @@ -444,8 +444,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; -- cgit v1.2.1 From 687b3c65c0460dd8c4ba7e63e3ae0ab20836e6e8 Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Fri, 22 Jan 2016 20:57:34 +0000 Subject: Fix alignment of buffers in ra_process and dhcpv6_request The packet buffer needs to be 32-bit aligned to ensure that the various 32-bit fields we pick out are naturally aligned. The control message buffers needs to be naturally aligned for struct cmsghdr. Signed-off-by: Ben Hutchings --- src/ra.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/ra.c') diff --git a/src/ra.c b/src/ra.c index 2d442f6..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; -- cgit v1.2.1