Author: rwatson
Date: Sun Apr 19 22:29:16 2009
New Revision: 191287
URL: http://svn.freebsd.org/changeset/base/191287

Log:
  In divert_packet(), lock the interface address list before iterating over
  it in search of an address.
  
  MFC after:    2 weeks

Modified:
  head/sys/netinet/ip_divert.c

Modified: head/sys/netinet/ip_divert.c
==============================================================================
--- head/sys/netinet/ip_divert.c        Sun Apr 19 22:25:09 2009        
(r191286)
+++ head/sys/netinet/ip_divert.c        Sun Apr 19 22:29:16 2009        
(r191287)
@@ -244,18 +244,22 @@ divert_packet(struct mbuf *m, int incomi
        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.
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to