Module Name:    src
Committed By:   ozaki-r
Date:           Wed May 31 01:31:08 UTC 2017

Modified Files:
        src/sys/netipsec: key.c

Log Message:
Hide details of the sadb message format (NFCI)

Especially src0 + 1 and dst0 + 1 shouldn't be exposed.


To generate a diff of this commit:
cvs rdiff -u -r1.150 -r1.151 src/sys/netipsec/key.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netipsec/key.c
diff -u src/sys/netipsec/key.c:1.150 src/sys/netipsec/key.c:1.151
--- src/sys/netipsec/key.c:1.150	Tue May 30 09:39:53 2017
+++ src/sys/netipsec/key.c	Wed May 31 01:31:07 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: key.c,v 1.150 2017/05/30 09:39:53 ozaki-r Exp $	*/
+/*	$NetBSD: key.c,v 1.151 2017/05/31 01:31:07 ozaki-r Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/key.c,v 1.3.2.3 2004/02/14 22:23:23 bms Exp $	*/
 /*	$KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $	*/
 
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.150 2017/05/30 09:39:53 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.151 2017/05/31 01:31:07 ozaki-r Exp $");
 
 /*
  * This code is referd to RFC 2367
@@ -340,27 +340,12 @@ do { \
 } while (0)
 
 /*
- * set parameters into secpolicyindex buffer.
- * Must allocate secpolicyindex buffer passed to this function.
- */
-#define KEY_SETSECSPIDX(_dir, s, d, ps, pd, ulp, idx) \
-do { \
-	memset((idx), 0, sizeof(struct secpolicyindex));                     \
-	(idx)->dir = (_dir);                                                 \
-	(idx)->prefs = (ps);                                                 \
-	(idx)->prefd = (pd);                                                 \
-	(idx)->ul_proto = (ulp);                                             \
-	memcpy(&(idx)->src, (s), ((const struct sockaddr *)(s))->sa_len);    \
-	memcpy(&(idx)->dst, (d), ((const struct sockaddr *)(d))->sa_len);    \
-} while (0)
-
-/*
  * set parameters into secasindex buffer.
  * Must allocate secasindex buffer before calling this function.
  */
 static int
-key_setsecasidx (int, int, int, const struct sadb_address *,
-		     const struct sadb_address *, struct secasindex *);
+key_setsecasidx(int, int, int, const struct sockaddr *,
+    const struct sockaddr *, struct secasindex *);
 
 /* key statistics */
 struct _keystat {
@@ -374,6 +359,16 @@ struct sadb_msghdr {
 	int extlen[SADB_EXT_MAX + 1];
 };
 
+static void
+key_init_spidx_bymsghdr(struct secpolicyindex *, const struct sadb_msghdr *);
+
+static const struct sockaddr *
+key_msghdr_get_sockaddr(const struct sadb_msghdr *mhp, int idx)
+{
+
+	return PFKEY_ADDR_SADDR((struct sadb_address *)mhp->ext[idx]);
+}
+
 static struct secasvar *key_allocsa_policy (const struct secasindex *);
 #if 0
 static void key_freeso(struct socket *);
@@ -1854,7 +1849,7 @@ static int
 key_spdadd(struct socket *so, struct mbuf *m,
 	   const struct sadb_msghdr *mhp)
 {
-	const struct sadb_address *src0, *dst0;
+	const struct sockaddr *src, *dst;
 	const struct sadb_x_policy *xpl0;
 	struct sadb_x_policy *xpl;
 	const struct sadb_lifetime *lft = NULL;
@@ -1889,19 +1884,11 @@ key_spdadd(struct socket *so, struct mbu
 		lft = (struct sadb_lifetime *)mhp->ext[SADB_EXT_LIFETIME_HARD];
 	}
 
-	src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
-	dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
+	src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
+	dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
 	xpl0 = (struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY];
 
-	/* make secindex */
-	/* XXX boundary check against sa_len */
-	KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir,
-	                src0 + 1,
-	                dst0 + 1,
-	                src0->sadb_address_prefixlen,
-	                dst0->sadb_address_prefixlen,
-	                src0->sadb_address_proto,
-	                &spidx);
+	key_init_spidx_bymsghdr(&spidx, mhp);
 
 	/* checking the direciton. */
 	switch (xpl0->sadb_x_policy_dir) {
@@ -1963,23 +1950,14 @@ key_spdadd(struct socket *so, struct mbu
 		return key_senderror(so, m, ENOBUFS);
 	}
 
-	/* XXX boundary check against sa_len */
-	KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir,
-	                src0 + 1,
-	                dst0 + 1,
-	                src0->sadb_address_prefixlen,
-	                dst0->sadb_address_prefixlen,
-	                src0->sadb_address_proto,
-	                &newsp->spidx);
+	key_init_spidx_bymsghdr(&newsp->spidx, mhp);
 
 	/* sanity check on addr pair */
-	if (((const struct sockaddr *)(src0 + 1))->sa_family !=
-	    ((const struct sockaddr *)(dst0+ 1))->sa_family) {
+	if (src->sa_family != dst->sa_family) {
 		kmem_free(newsp, sizeof(*newsp));
 		return key_senderror(so, m, EINVAL);
 	}
-	if (((const struct sockaddr *)(src0 + 1))->sa_len !=
-	    ((const struct sockaddr *)(dst0+ 1))->sa_len) {
+	if (src->sa_len != dst->sa_len) {
 		kmem_free(newsp, sizeof(*newsp));
 		return key_senderror(so, m, EINVAL);
 	}
@@ -2114,7 +2092,6 @@ static int
 key_spddelete(struct socket *so, struct mbuf *m,
               const struct sadb_msghdr *mhp)
 {
-	struct sadb_address *src0, *dst0;
 	struct sadb_x_policy *xpl0;
 	struct secpolicyindex spidx;
 	struct secpolicy *sp;
@@ -2137,19 +2114,10 @@ key_spddelete(struct socket *so, struct 
 		return key_senderror(so, m, EINVAL);
 	}
 
-	src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
-	dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
-	xpl0 = (struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY];
-
 	/* make secindex */
-	/* XXX boundary check against sa_len */
-	KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir,
-	                src0 + 1,
-	                dst0 + 1,
-	                src0->sadb_address_prefixlen,
-	                dst0->sadb_address_prefixlen,
-	                src0->sadb_address_proto,
-	                &spidx);
+	key_init_spidx_bymsghdr(&spidx, mhp);
+
+	xpl0 = (struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY];
 
 	/* checking the direciton. */
 	switch (xpl0->sadb_x_policy_dir) {
@@ -4807,9 +4775,8 @@ key_proto2satype(u_int16_t proto)
 
 static int
 key_setsecasidx(int proto, int mode, int reqid,
-	        const struct sadb_address * src,
-	 	const struct sadb_address * dst,
-		struct secasindex * saidx)
+    const struct sockaddr *src, const struct sockaddr *dst,
+    struct secasindex * saidx)
 {
 	const union sockaddr_union *src_u = (const union sockaddr_union *)src;
 	const union sockaddr_union *dst_u = (const union sockaddr_union *)dst;
@@ -4832,6 +4799,30 @@ key_setsecasidx(int proto, int mode, int
 	return 0;
 }
 
+static void
+key_init_spidx_bymsghdr(struct secpolicyindex *spidx,
+    const struct sadb_msghdr *mhp)
+{
+	const struct sadb_address *src0, *dst0;
+	const struct sockaddr *src, *dst;
+	const struct sadb_x_policy *xpl0;
+
+	src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
+	dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
+	src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
+	dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
+	xpl0 = (struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY];
+
+	memset(spidx, 0, sizeof(*spidx));
+	spidx->dir = xpl0->sadb_x_policy_dir;
+	spidx->prefs = src0->sadb_address_prefixlen;
+	spidx->prefd = dst0->sadb_address_prefixlen;
+	spidx->ul_proto = src0->sadb_address_proto;
+	/* XXX boundary check against sa_len */
+	memcpy(&spidx->src, src, src->sa_len);
+	memcpy(&spidx->dst, dst, dst->sa_len);
+}
+
 /* %%% PF_KEY */
 /*
  * SADB_GETSPI processing is to receive
@@ -4849,7 +4840,7 @@ static int
 key_getspi(struct socket *so, struct mbuf *m,
 	   const struct sadb_msghdr *mhp)
 {
-	struct sadb_address *src0, *dst0;
+	const struct sockaddr *src, *dst;
 	struct secasindex saidx;
 	struct secashead *newsah;
 	struct secasvar *newsav;
@@ -4883,8 +4874,8 @@ key_getspi(struct socket *so, struct mbu
 		reqid = 0;
 	}
 
-	src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]);
-	dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]);
+	src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
+	dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
 
 	/* map satype to proto */
 	proto = key_satype2proto(mhp->msg->sadb_msg_satype);
@@ -4894,7 +4885,7 @@ key_getspi(struct socket *so, struct mbu
 	}
 
 
-	error = key_setsecasidx(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
+	error = key_setsecasidx(proto, mode, reqid, src, dst, &saidx);
 	if (error != 0)
 		return key_senderror(so, m, EINVAL);
 
@@ -5222,7 +5213,7 @@ static int
 key_update(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
 {
 	struct sadb_sa *sa0;
-	struct sadb_address *src0, *dst0;
+	const struct sockaddr *src, *dst;
 	struct secasindex saidx;
 	struct secashead *sah;
 	struct secasvar *sav;
@@ -5274,10 +5265,10 @@ key_update(struct socket *so, struct mbu
 	/* XXX boundary checking for other extensions */
 
 	sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA];
-	src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]);
-	dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]);
+	src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
+	dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
 
-	error = key_setsecasidx(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
+	error = key_setsecasidx(proto, mode, reqid, src, dst, &saidx);
 	if (error != 0)
 		return key_senderror(so, m, EINVAL);
 
@@ -5425,7 +5416,7 @@ key_add(struct socket *so, struct mbuf *
 	const struct sadb_msghdr *mhp)
 {
 	struct sadb_sa *sa0;
-	struct sadb_address *src0, *dst0;
+	const struct sockaddr *src, *dst;
 	struct secasindex saidx;
 	struct secashead *newsah;
 	struct secasvar *newsav;
@@ -5476,10 +5467,10 @@ key_add(struct socket *so, struct mbuf *
 	}
 
 	sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA];
-	src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
-	dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
+	src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
+	dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
 
-	error = key_setsecasidx(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
+	error = key_setsecasidx(proto, mode, reqid, src, dst, &saidx);
 	if (error != 0)
 		return key_senderror(so, m, EINVAL);
 
@@ -5678,7 +5669,7 @@ key_delete(struct socket *so, struct mbu
 	   const struct sadb_msghdr *mhp)
 {
 	struct sadb_sa *sa0;
-	struct sadb_address *src0, *dst0;
+	const struct sockaddr *src, *dst;
 	struct secasindex saidx;
 	struct secashead *sah;
 	struct secasvar *sav = NULL;
@@ -5723,11 +5714,10 @@ key_delete(struct socket *so, struct mbu
 	}
 
 	sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA];
-	src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]);
-	dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]);
+	src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
+	dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
 
-	error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1,
-	    &saidx);
+	error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src, dst, &saidx);
 	if (error != 0)
 		return key_senderror(so, m, EINVAL);
 
@@ -5786,18 +5776,17 @@ static int
 key_delete_all(struct socket *so, struct mbuf *m,
 	       const struct sadb_msghdr *mhp, u_int16_t proto)
 {
-	struct sadb_address *src0, *dst0;
+	const struct sockaddr *src, *dst;
 	struct secasindex saidx;
 	struct secashead *sah;
 	struct secasvar *sav, *nextsav;
 	u_int state;
 	int error;
 
-	src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]);
-	dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]);
+	src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
+	dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
 
-	error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1,
-	    &saidx);
+	error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src, dst, &saidx);
 	if (error != 0)
 		return key_senderror(so, m, EINVAL);
 
@@ -5872,7 +5861,7 @@ key_get(struct socket *so, struct mbuf *
 	const struct sadb_msghdr *mhp)
 {
 	struct sadb_sa *sa0;
-	struct sadb_address *src0, *dst0;
+	const struct sockaddr *src, *dst;
 	struct secasindex saidx;
 	struct secashead *sah;
 	struct secasvar *sav = NULL;
@@ -5904,11 +5893,10 @@ key_get(struct socket *so, struct mbuf *
 	}
 
 	sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA];
-	src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
-	dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
+	src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
+	dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
 
-	error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1,
-	    &saidx);
+	error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src, dst, &saidx);
 	if (error != 0)
 		return key_senderror(so, m, EINVAL);
 
@@ -6520,7 +6508,7 @@ static int
 key_acquire2(struct socket *so, struct mbuf *m,
       	     const struct sadb_msghdr *mhp)
 {
-	const struct sadb_address *src0, *dst0;
+	const struct sockaddr *src, *dst;
 	struct secasindex saidx;
 	struct secashead *sah;
 	u_int16_t proto;
@@ -6595,11 +6583,10 @@ key_acquire2(struct socket *so, struct m
 		return key_senderror(so, m, EINVAL);
 	}
 
-	src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC];
-	dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST];
+	src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
+	dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
 
-	error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1,
-	    &saidx);
+	error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src, dst, &saidx);
 	if (error != 0)
 		return key_senderror(so, m, EINVAL);
 

Reply via email to