Module Name: src Committed By: roy Date: Fri Apr 20 10:26:34 UTC 2018
Modified Files: src/usr.sbin/rtadvd: rrenum.c rtadvd.c Log Message: Fix some unaligned pointer issues. To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/usr.sbin/rtadvd/rrenum.c cvs rdiff -u -r1.59 -r1.60 src/usr.sbin/rtadvd/rtadvd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/rtadvd/rrenum.c diff -u src/usr.sbin/rtadvd/rrenum.c:1.20 src/usr.sbin/rtadvd/rrenum.c:1.21 --- src/usr.sbin/rtadvd/rrenum.c:1.20 Mon Nov 6 15:15:04 2017 +++ src/usr.sbin/rtadvd/rrenum.c Fri Apr 20 10:26:34 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: rrenum.c,v 1.20 2017/11/06 15:15:04 christos Exp $ */ +/* $NetBSD: rrenum.c,v 1.21 2018/04/20 10:26:34 roy Exp $ */ /* $KAME: rrenum.c,v 1.14 2004/06/14 05:36:00 itojun Exp $ */ /* @@ -147,6 +147,7 @@ do_use_prefix(int len, struct rr_pco_mat struct rr_pco_use *rpu, *rpulim; struct rainfo *rai; struct prefix *pp; + struct in6_addr rpm_prefix, rpu_prefix; rpu = (struct rr_pco_use *)(rpm + 1); rpulim = (struct rr_pco_use *)((char *)rpm + len); @@ -201,8 +202,10 @@ do_use_prefix(int len, struct rr_pco_mat logit(LOG_ERR, "<%s> ioctl: %m", __func__); /* very adhoc: should be rewritten */ + memcpy(&rpm_prefix, &rpm->rpm_prefix, sizeof(rpm_prefix)); + memcpy(&rpu_prefix, &rpu->rpu_prefix, sizeof(rpu_prefix)); if (rpm->rpm_code == RPM_PCO_CHANGE && - IN6_ARE_ADDR_EQUAL(&rpm->rpm_prefix, &rpu->rpu_prefix) && + IN6_ARE_ADDR_EQUAL(&rpm_prefix, &rpu_prefix) && rpm->rpm_matchlen == rpu->rpu_uselen && rpu->rpu_uselen == rpu->rpu_keeplen) { if ((rai = if_indextorainfo(ifindex)) == NULL) @@ -212,7 +215,7 @@ do_use_prefix(int len, struct rr_pco_mat struct timespec now; if (prefix_match(&pp->prefix, pp->prefixlen, - &rpm->rpm_prefix, + &rpm_prefix, rpm->rpm_matchlen)) { /* change parameters */ pp->validlifetime = ntohl(rpu->rpu_vltime); Index: src/usr.sbin/rtadvd/rtadvd.c diff -u src/usr.sbin/rtadvd/rtadvd.c:1.59 src/usr.sbin/rtadvd/rtadvd.c:1.60 --- src/usr.sbin/rtadvd/rtadvd.c:1.59 Sat Nov 25 02:37:04 2017 +++ src/usr.sbin/rtadvd/rtadvd.c Fri Apr 20 10:26:34 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: rtadvd.c,v 1.59 2017/11/25 02:37:04 kre Exp $ */ +/* $NetBSD: rtadvd.c,v 1.60 2018/04/20 10:26:34 roy Exp $ */ /* $KAME: rtadvd.c,v 1.92 2005/10/17 14:40:02 suz Exp $ */ /* @@ -1213,21 +1213,24 @@ prefix_check(struct nd_opt_prefix_info * int inconsistent = 0; char ntopbuf[INET6_ADDRSTRLEN], prefixbuf[INET6_ADDRSTRLEN]; struct timespec now; + struct in6_addr prefix; #if 0 /* impossible */ if (pinfo->nd_opt_pi_type != ND_OPT_PREFIX_INFORMATION) return 0; #endif + memcpy(&prefix, &pinfo->nd_opt_pi_prefix, sizeof(prefix)); + /* * log if the adveritsed prefix has link-local scope(sanity check?) */ - if (IN6_IS_ADDR_LINKLOCAL(&pinfo->nd_opt_pi_prefix)) { + if (IN6_IS_ADDR_LINKLOCAL(&prefix)) { logit(LOG_INFO, "%s: link-local prefix %s/%d is advertised " "from %s on %s", __func__, - inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, + inet_ntop(AF_INET6, &prefix, prefixbuf, INET6_ADDRSTRLEN), pinfo->nd_opt_pi_prefix_len, inet_ntop(AF_INET6, &from->sin6_addr, @@ -1235,12 +1238,12 @@ prefix_check(struct nd_opt_prefix_info * rai->ifname); } - if ((pp = find_prefix(rai, &pinfo->nd_opt_pi_prefix, + if ((pp = find_prefix(rai, &prefix, pinfo->nd_opt_pi_prefix_len)) == NULL) { logit(LOG_INFO, "%s: prefix %s/%d from %s on %s is not in our list", __func__, - inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, + inet_ntop(AF_INET6, &prefix, prefixbuf, INET6_ADDRSTRLEN), pinfo->nd_opt_pi_prefix_len, inet_ntop(AF_INET6, &from->sin6_addr, @@ -1268,7 +1271,7 @@ prefix_check(struct nd_opt_prefix_info * " (decr. in real time) inconsistent on %s:" " %d from %s, %ld from us", __func__, - inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, + inet_ntop(AF_INET6, &prefix, prefixbuf, INET6_ADDRSTRLEN), pinfo->nd_opt_pi_prefix_len, rai->ifname, preferred_time, @@ -1283,7 +1286,7 @@ prefix_check(struct nd_opt_prefix_info * " inconsistent on %s:" " %d from %s, %d from us", __func__, - inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, + inet_ntop(AF_INET6, &prefix, prefixbuf, INET6_ADDRSTRLEN), pinfo->nd_opt_pi_prefix_len, rai->ifname, preferred_time, @@ -1304,7 +1307,7 @@ prefix_check(struct nd_opt_prefix_info * " (decr. in real time) inconsistent on %s:" " %d from %s, %ld from us", __func__, - inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, + inet_ntop(AF_INET6, &prefix, prefixbuf, INET6_ADDRSTRLEN), pinfo->nd_opt_pi_prefix_len, rai->ifname, preferred_time, @@ -1319,7 +1322,7 @@ prefix_check(struct nd_opt_prefix_info * " inconsistent on %s:" " %d from %s, %d from us", __func__, - inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, + inet_ntop(AF_INET6, &prefix, prefixbuf, INET6_ADDRSTRLEN), pinfo->nd_opt_pi_prefix_len, rai->ifname, valid_time,