From: Steven Barth Date: Sun, 31 Jan 2016 15:18:16 +0000 (+0100) Subject: Merge pull request #44 from bwhacks/alignment-fixes X-Git-Tag: debian/1.1+git20160131-1~5 X-Git-Url: https://git.decadent.org.uk/gitweb/?p=odhcp6c.git;a=commitdiff_plain;h=ec7f4701b348f5c4c3191ca83ecd8453c431c432;hp=-c Merge pull request #44 from bwhacks/alignment-fixes Alignment fixes --- ec7f4701b348f5c4c3191ca83ecd8453c431c432 diff --combined src/dhcpv6.c index c5f11f1,f91f2cf..3e128bc --- a/src/dhcpv6.c +++ b/src/dhcpv6.c @@@ -110,6 -110,14 +110,14 @@@ static uint8_t reconf_key[16] static unsigned int client_options = 0; + static uint32_t ntohl_unaligned(const uint8_t *data) + { + uint32_t buf; + + memcpy(&buf, data, sizeof(buf)); + return ntohl(buf); + } + int init_dhcpv6(const char *ifname, unsigned int options, int sol_timeout) { client_options = options; @@@ -577,7 -585,9 +585,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), @@@ -692,7 -702,8 +702,8 @@@ static bool dhcpv6_response_is_valid(co continue; md5_ctx_t md5; - uint8_t serverhash[16], secretbytes[64], hash[16]; + uint8_t serverhash[16], secretbytes[64]; + uint32_t hash[4]; memcpy(serverhash, r->key, sizeof(serverhash)); memset(r->key, 0, sizeof(r->key)); @@@ -804,12 -815,12 +815,12 @@@ static int dhcpv6_handle_advert(enum dh } else if (otype == DHCPV6_OPT_RECONF_ACCEPT) { cand.wants_reconfigure = true; } else if (otype == DHCPV6_OPT_SOL_MAX_RT && olen == 4) { - uint32_t sol_max_rt = ntohl(*((uint32_t *)odata)); + uint32_t sol_max_rt = ntohl_unaligned(odata); if (sol_max_rt >= DHCPV6_SOL_MAX_RT_MIN && sol_max_rt <= DHCPV6_SOL_MAX_RT_MAX) cand.sol_max_rt = sol_max_rt; } else if (otype == DHCPV6_OPT_INF_MAX_RT && olen == 4) { - uint32_t inf_max_rt = ntohl(*((uint32_t *)odata)); + uint32_t inf_max_rt = ntohl_unaligned(odata); if (inf_max_rt >= DHCPV6_INF_MAX_RT_MIN && inf_max_rt <= DHCPV6_INF_MAX_RT_MAX) cand.inf_max_rt = inf_max_rt; @@@ -989,7 -1000,7 +1000,7 @@@ static int dhcpv6_handle_reply(enum dhc if (code != DHCPV6_Success) continue; - dhcpv6_parse_ia(ia_hdr, odata + olen + sizeof(*ia_hdr)); + dhcpv6_parse_ia(ia_hdr, odata + olen); passthru = false; } else if (otype == DHCPV6_OPT_STATUS && olen >= 2) { uint8_t *mdata = (olen > 2) ? &odata[2] : NULL; @@@ -1027,7 -1038,7 +1038,7 @@@ } else if (otype == DHCPV6_OPT_SIP_SERVER_D) { odhcp6c_add_state(STATE_SIP_FQDN, odata, olen); } else if (otype == DHCPV6_OPT_INFO_REFRESH && olen >= 4) { - refresh = ntohl(*((uint32_t*)odata)); + refresh = ntohl_unaligned(odata); passthru = false; } else if (otype == DHCPV6_OPT_AUTH) { if (olen == -4 + sizeof(struct dhcpv6_auth_reconfigure)) { @@@ -1044,13 -1055,13 +1055,13 @@@ odhcp6c_add_state(STATE_AFTR_NAME, odata, olen); passthru = false; } else if (otype == DHCPV6_OPT_SOL_MAX_RT && olen == 4) { - uint32_t sol_max_rt = ntohl(*((uint32_t *)odata)); + uint32_t sol_max_rt = ntohl_unaligned(odata); if (sol_max_rt >= DHCPV6_SOL_MAX_RT_MIN && sol_max_rt <= DHCPV6_SOL_MAX_RT_MAX) dhcpv6_retx[DHCPV6_MSG_SOLICIT].max_timeo = sol_max_rt; passthru = false; } else if (otype == DHCPV6_OPT_INF_MAX_RT && olen == 4) { - uint32_t inf_max_rt = ntohl(*((uint32_t *)odata)); + uint32_t inf_max_rt = ntohl_unaligned(odata); if (inf_max_rt >= DHCPV6_INF_MAX_RT_MIN && inf_max_rt <= DHCPV6_INF_MAX_RT_MAX) dhcpv6_retx[DHCPV6_MSG_INFO_REQ].max_timeo = inf_max_rt; diff --combined src/script.c index b20e94c,72add21..fdc050b --- a/src/script.c +++ b/src/script.c @@@ -173,7 -173,7 +173,7 @@@ static void entry_to_env(const char *na buf_len += strlen(&buf[buf_len]); if (type != ENTRY_HOST) { snprintf(&buf[buf_len], 6, "/%"PRIu16, e[i].length); - buf += strlen(&buf[buf_len]); + buf_len += strlen(&buf[buf_len]); if (type == ENTRY_ROUTE) { buf[buf_len++] = ','; if (!IN6_IS_ADDR_UNSPECIFIED(&e[i].router)) { @@@ -181,15 -181,15 +181,15 @@@ buf_len += strlen(&buf[buf_len]); } snprintf(&buf[buf_len], 23, ",%u,%u", e[i].valid, e[i].priority); - buf += strlen(&buf[buf_len]); + buf_len += strlen(&buf[buf_len]); } else { snprintf(&buf[buf_len], 23, ",%u,%u", e[i].preferred, e[i].valid); - buf += strlen(&buf[buf_len]); + buf_len += strlen(&buf[buf_len]); } if (type == ENTRY_PREFIX && ntohl(e[i].iaid) != 1) { snprintf(&buf[buf_len], 16, ",class=%08x", ntohl(e[i].iaid)); - buf += strlen(&buf[buf_len]); + buf_len += strlen(&buf[buf_len]); } if (type == ENTRY_PREFIX && e[i].priority) { @@@ -220,8 -220,9 +220,9 @@@ static void search_to_env(const char *n *c++ = '='; for (struct odhcp6c_entry *e = (struct odhcp6c_entry*)start; - (uint8_t*)e < &start[len] && &e->auxtarget[e->auxlen] <= &start[len]; - e = (struct odhcp6c_entry*)(&e->auxtarget[e->auxlen])) { + (uint8_t*)e < &start[len] && + (uint8_t*)odhcp6c_next_entry(e) <= &start[len]; + e = odhcp6c_next_entry(e)) { c = mempcpy(c, e->auxtarget, e->auxlen); *c++ = ' '; }