Skip to content

Commit

Permalink
Fix alignment of buffers in ra_process and dhcpv6_request
Browse files Browse the repository at this point in the history
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 <ben@decadent.org.uk>
  • Loading branch information
bwhacks committed Jan 28, 2016
1 parent 8a8005f commit 687b3c6
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/dhcpv6.c
Expand Up @@ -577,7 +577,9 @@ int dhcpv6_request(enum dhcpv6_msg type)
// Receive rounds
for (; len < 0 && (round_start < round_end);
round_start = odhcp6c_get_milli_time()) {
uint8_t buf[1536], cmsg_buf[CMSG_SPACE(sizeof(struct in6_pktinfo))];
uint8_t buf[1536];
uint8_t cmsg_buf[CMSG_SPACE(sizeof(struct in6_pktinfo))]
__aligned(__alignof__(struct cmsghdr));
struct iovec iov = {buf, sizeof(buf)};
struct sockaddr_in6 addr;
struct msghdr msg = {.msg_name = &addr, .msg_namelen = sizeof(addr),
Expand Down
1 change: 1 addition & 0 deletions src/odhcp6c.h
Expand Up @@ -18,6 +18,7 @@

#define _unused __attribute__((unused))
#define _packed __attribute__((packed))
#define __aligned(n) __attribute__((aligned(n)))

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

Expand Down
3 changes: 2 additions & 1 deletion src/ra.c
Expand Up @@ -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;
Expand Down

0 comments on commit 687b3c6

Please sign in to comment.