]> git.decadent.org.uk Git - odhcp6c.git/commitdiff
Merge pull request #44 from bwhacks/alignment-fixes
authorSteven Barth <steven@midlink.org>
Sun, 31 Jan 2016 15:18:16 +0000 (16:18 +0100)
committerSteven Barth <steven@midlink.org>
Sun, 31 Jan 2016 15:18:16 +0000 (16:18 +0100)
Alignment fixes

1  2 
src/dhcpv6.c
src/script.c

diff --combined src/dhcpv6.c
index c5f11f13141dfeb87c4eff4ddb82890ae49b16c2,f91f2cf16b8c8ff6fe881310433b98b68e2d8780..3e128bcfa151c1001d56ccd6661b3eb880bbfc77
@@@ -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;
                        } 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)) {
                                        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 b20e94c9460c92ae45312bf48436ad73e0dd2d89,72add2135e8c6aae37184a9699fd43ca70036d50..fdc050bbccb6d5f02ce24c594af2d0d0a3e6c6de
@@@ -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)) {
                                        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++ = ' ';
        }