diff options
author | rwatson <rwatson@FreeBSD.org> | 2009-04-19 22:01:38 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2009-04-19 22:01:38 +0000 |
commit | 1e1a0b82b34f1ae64d21ef6fa351b5057da220dc (patch) | |
tree | 83c3d71cc64b95b476facaa86b35bb973b6f62b6 /sys/netatalk | |
parent | e6e3922548a6c4c05a1a5f1d77849bd7aa735fac (diff) | |
download | FreeBSD-src-1e1a0b82b34f1ae64d21ef6fa351b5057da220dc.zip FreeBSD-src-1e1a0b82b34f1ae64d21ef6fa351b5057da220dc.tar.gz |
Lock interface address list lock around ifaddr inserts and deletes
in at_control(). This locking is not yet complete but should prevent
some classes of race conditions.
MFC after: 2 weeks
Diffstat (limited to 'sys/netatalk')
-rw-r--r-- | sys/netatalk/at_control.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/netatalk/at_control.c b/sys/netatalk/at_control.c index c8c563f..cfb1bd8 100644 --- a/sys/netatalk/at_control.c +++ b/sys/netatalk/at_control.c @@ -191,7 +191,6 @@ at_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, ifa = (struct ifaddr *)aa; IFA_LOCK_INIT(ifa); ifa->ifa_refcnt = 1; - TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link); /* * As the at_ifaddr contains the actual sockaddrs, @@ -214,6 +213,9 @@ at_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, * and link it all together */ aa->aa_ifp = ifp; + IF_ADDR_LOCK(ifp); + TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link); + IF_ADDR_UNLOCK(ifp); } else { /* * If we DID find one then we clobber any routes @@ -296,7 +298,9 @@ at_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, * remove the ifaddr from the interface */ ifa0 = (struct ifaddr *)aa; + IF_ADDR_LOCK(ifp); TAILQ_REMOVE(&ifp->if_addrhead, ifa0, ifa_link); + IF_ADDR_UNLOCK(ifp); /* * Now remove the at_ifaddr from the parallel structure |