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,

Reply via email to