summaryrefslogtreecommitdiffstats
path: root/sys/netatalk
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2009-04-19 22:01:38 +0000
committerrwatson <rwatson@FreeBSD.org>2009-04-19 22:01:38 +0000
commit1e1a0b82b34f1ae64d21ef6fa351b5057da220dc (patch)
tree83c3d71cc64b95b476facaa86b35bb973b6f62b6 /sys/netatalk
parente6e3922548a6c4c05a1a5f1d77849bd7aa735fac (diff)
downloadFreeBSD-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.c6
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
OpenPOWER on IntegriCloud