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-all
mailing list