aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet/ip_divert.c
diff options
context:
space:
mode:
authorRobert Watson <rwatson@FreeBSD.org>2009-04-19 22:29:16 +0000
committerRobert Watson <rwatson@FreeBSD.org>2009-04-19 22:29:16 +0000
commitb132600ab26caed1b48a927a4714e6ed5db2ecef (patch)
treebdcf6894120fe9bc0b1be62743eadf5c634f7f83 /sys/netinet/ip_divert.c
parent9317b04e4643ec438d7cca59d98832fae31697de (diff)
downloadsrc-b132600ab26caed1b48a927a4714e6ed5db2ecef.tar.gz
src-b132600ab26caed1b48a927a4714e6ed5db2ecef.zip
In divert_packet(), lock the interface address list before iterating over
it in search of an address. MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=191287
Diffstat (limited to 'sys/netinet/ip_divert.c')
-rw-r--r--sys/netinet/ip_divert.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c
index f39c655f90bb..8a2fc25faaa6 100644
--- a/sys/netinet/ip_divert.c
+++ b/sys/netinet/ip_divert.c
@@ -244,18 +244,22 @@ divert_packet(struct mbuf *m, int incoming)
divsrc.sin_port = divert_cookie(mtag); /* record matching rule */
if (incoming) {
struct ifaddr *ifa;
+ struct ifnet *ifp;
/* Sanity check */
M_ASSERTPKTHDR(m);
/* Find IP address for receive interface */
- TAILQ_FOREACH(ifa, &m->m_pkthdr.rcvif->if_addrhead, ifa_link) {
+ ifp = m->m_pkthdr.rcvif;
+ IF_ADDR_LOCK(ifp);
+ TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
if (ifa->ifa_addr->sa_family != AF_INET)
continue;
divsrc.sin_addr =
((struct sockaddr_in *) ifa->ifa_addr)->sin_addr;
break;
}
+ IF_ADDR_UNLOCK(ifp);
}
/*
* Record the incoming interface name whenever we have one.