uint8_t nb, *pw;
uint16_t ol;
struct dhcp6_pd_addr pdp;
+ struct in6_addr pdp_prefix;
i = 0;
state = D6_STATE(ifp);
o += sizeof(pdp);
ol = (uint16_t)(ol - sizeof(pdp));
+ /* pdp.prefix is not aligned so copy it out. */
+ memcpy(&pdp_prefix, &pdp.prefix, sizeof(pdp_prefix));
TAILQ_FOREACH(a, &state->addrs, next) {
- if (IN6_ARE_ADDR_EQUAL(&a->prefix, &pdp.prefix))
+ if (IN6_ARE_ADDR_EQUAL(&a->prefix, &pdp_prefix))
break;
}
a->dadcallback = dhcp6_dadcallback;
a->ia_type = D6_OPTION_IA_PD;
memcpy(a->iaid, iaid, sizeof(a->iaid));
- /* pdp.prefix is not aligned so copy it in. */
- memcpy(&a->prefix, &pdp.prefix, sizeof(a->prefix));
+ /* pdp.prefix is not aligned so use copy. */
+ a->prefix = pdp_prefix;
a->prefix_len = pdp.prefix_len;
ia = inet_ntop(AF_INET6, &a->prefix,
iabuf, sizeof(iabuf));
char buf[INET6_ADDRSTRLEN];
const char *cbp;
struct ra *rap;
+ struct in6_addr pi_prefix;
struct ipv6_addr *ap;
struct dhcp_opt *dho;
uint8_t new_rap, new_data;
ifp->name);
continue;
}
- if (IN6_IS_ADDR_MULTICAST(&pi.nd_opt_pi_prefix) ||
- IN6_IS_ADDR_LINKLOCAL(&pi.nd_opt_pi_prefix))
+ /* nd_opt_pi_prefix is not aligned. */
+ memcpy(&pi_prefix, &pi.nd_opt_pi_prefix, sizeof(pi_prefix));
+ if (IN6_IS_ADDR_MULTICAST(&pi_prefix) ||
+ IN6_IS_ADDR_LINKLOCAL(&pi_prefix))
{
logger(ifp->ctx, new_data ? LOG_ERR : LOG_DEBUG,
"%s: invalid prefix in RA", ifp->name);
}
TAILQ_FOREACH(ap, &rap->addrs, next)
if (ap->prefix_len ==pi.nd_opt_pi_prefix_len &&
- IN6_ARE_ADDR_EQUAL(&ap->prefix,
- &pi.nd_opt_pi_prefix))
+ IN6_ARE_ADDR_EQUAL(&ap->prefix, &pi_prefix))
break;
if (ap == NULL) {
if (!(pi.nd_opt_pi_flags_reserved &
ap->iface = rap->iface;
ap->flags = IPV6_AF_NEW;
ap->prefix_len = pi.nd_opt_pi_prefix_len;
- ap->prefix = pi.nd_opt_pi_prefix;
+ ap->prefix = pi_prefix;
if (pi.nd_opt_pi_flags_reserved &
ND_OPT_PI_FLAG_AUTO &&
ap->iface->options->options &
struct icmp6_hdr *icp, size_t len, int hoplimit)
{
struct nd_neighbor_advert *nd_na;
+ struct in6_addr nd_na_target;
struct ra *rap;
uint32_t is_router, is_solicited;
char buf[INET6_ADDRSTRLEN];
taddr = inet_ntop(AF_INET6, &nd_na->nd_na_target,
buf, INET6_ADDRSTRLEN);
- if (IN6_IS_ADDR_MULTICAST(&nd_na->nd_na_target)) {
+ /* nd_na->nd_na_target is not aligned. */
+ memcpy(&nd_na_target, &nd_na->nd_na_target, sizeof(nd_na_target));
+ if (IN6_IS_ADDR_MULTICAST(&nd_na_target)) {
logger(ifp->ctx, LOG_ERR, "%s: NA multicast address %s (%s)",
ifp->name, taddr, ctx->sfrom);
return;
TAILQ_FOREACH(rap, ctx->ra_routers, next) {
if (rap->iface == ifp &&
- IN6_ARE_ADDR_EQUAL(&rap->from, &nd_na->nd_na_target))
+ IN6_ARE_ADDR_EQUAL(&rap->from, &nd_na_target))
break;
}
if (rap == NULL) {