svn commit: r194606 - head/sys/netipx

Robert Watson rwatson at FreeBSD.org
Sun Jun 21 20:08:08 UTC 2009


Author: rwatson
Date: Sun Jun 21 20:08:07 2009
New Revision: 194606
URL: http://svn.freebsd.org/changeset/base/194606

Log:
  In ipx_control(), lock if_addr_mtx when adding/removing addresses from
  interface address lists, and don't add an address until it's fully
  initialized.
  
  MFC after:	3 weeks

Modified:
  head/sys/netipx/ipx.c

Modified: head/sys/netipx/ipx.c
==============================================================================
--- head/sys/netipx/ipx.c	Sun Jun 21 19:50:06 2009	(r194605)
+++ head/sys/netipx/ipx.c	Sun Jun 21 20:08:07 2009	(r194606)
@@ -171,12 +171,9 @@ ipx_control(struct socket *so, u_long cm
 			ia = oia;
 			ifa = (struct ifaddr *)ia;
 			ifa_init(ifa);
-			TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link);
 			ia->ia_ifp = ifp;
 			ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr;
-
 			ifa->ifa_netmask = (struct sockaddr *)&ipx_netmask;
-
 			ifa->ifa_dstaddr = (struct sockaddr *)&ia->ia_dstaddr;
 			if (ifp->if_flags & IFF_BROADCAST) {
 				ia->ia_broadaddr.sipx_family = AF_IPX;
@@ -185,6 +182,9 @@ ipx_control(struct socket *so, u_long cm
 				ia->ia_broadaddr.sipx_addr.x_host =
 				    ipx_broadhost;
 			}
+			IF_ADDR_LOCK(ifp);
+			TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link);
+			IF_ADDR_UNLOCK(ifp);
 		}
 		break;
 
@@ -217,7 +217,9 @@ ipx_control(struct socket *so, u_long cm
 	case SIOCDIFADDR:
 		ipx_ifscrub(ifp, ia);
 		ifa = (struct ifaddr *)ia;
+		IF_ADDR_LOCK(ifp);
 		TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
+		IF_ADDR_UNLOCK(ifp);
 		oia = ia;
 		if (oia == (ia = ipx_ifaddr)) {
 			ipx_ifaddr = ia->ia_next;


More information about the svn-src-head mailing list