svn commit: r311704 - projects/ipsec/sys/netipsec

Andrey V. Elsukov ae at FreeBSD.org
Sun Jan 8 21:30:06 UTC 2017


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);
 }
 


More information about the svn-src-projects mailing list