Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Jan 2017 21:30:05 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r311704 - projects/ipsec/sys/netipsec
Message-ID:  <201701082130.v08LU57Y089737@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Sun Jan  8 21:30:04 2017
New Revision: 311704
URL: https://svnweb.freebsd.org/changeset/base/311704

Log:
  Take INP_WLOCK() in ipsec_set_pcbpolicy() to modify INPCB policy.

Modified:
  projects/ipsec/sys/netipsec/ipsec_pcb.c

Modified: projects/ipsec/sys/netipsec/ipsec_pcb.c
==============================================================================
--- projects/ipsec/sys/netipsec/ipsec_pcb.c	Sun Jan  8 21:12:46 2017	(r311703)
+++ projects/ipsec/sys/netipsec/ipsec_pcb.c	Sun Jan  8 21:30:04 2017	(r311704)
@@ -276,12 +276,7 @@ ipsec_set_pcbpolicy(struct inpcb *inp, s
 	/* Select direction. */
 	switch (xpl->sadb_x_policy_dir) {
 	case IPSEC_DIR_INBOUND:
-		spp = &inp->inp_sp->sp_in;
-		flags = INP_INBOUND_POLICY;
-		break;
 	case IPSEC_DIR_OUTBOUND:
-		spp = &inp->inp_sp->sp_out;
-		flags = INP_OUTBOUND_POLICY;
 		break;
 	default:
 		ipseclog((LOG_ERR, "%s: invalid direction=%u\n", __func__,
@@ -333,6 +328,14 @@ ipsec_set_pcbpolicy(struct inpcb *inp, s
 		return (EINVAL);
 	}
 
+	INP_WLOCK(inp);
+	if (xpl->sadb_x_policy_dir == IPSEC_DIR_INBOUND) {
+		spp = &inp->inp_sp->sp_in;
+		flags = INP_INBOUND_POLICY;
+	} else {
+		spp = &inp->inp_sp->sp_out;
+		flags = INP_OUTBOUND_POLICY;
+	}
 	/* Clear old SP and set new SP. */
 	if (*spp != NULL)
 		key_freesp(spp);
@@ -345,6 +348,7 @@ ipsec_set_pcbpolicy(struct inpcb *inp, s
 		inp->inp_sp->flags |= flags;
 		KEYDBG(IPSEC_DUMP, kdebug_secpolicy(newsp));
 	}
+	INP_WUNLOCK(inp);
 	return (0);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201701082130.v08LU57Y089737>