Author: bz
Date: Sat Oct 16 19:25:27 2010
New Revision: 213930
URL: http://svn.freebsd.org/changeset/base/213930

Log:
  Close a race acquiring the IF_ADDR_LOCK() for each entry while iterating
  over all interfaces to make sure the address will neither change nor be
  freed while we are working on it.
  
  PR:           kern/146250
  Submitted by: Mikolaj Golub (to.my.trociny gmail.com)
  MFC after:    1 week

Modified:
  head/sys/net/rtsock.c

Modified: head/sys/net/rtsock.c
==============================================================================
--- head/sys/net/rtsock.c       Sat Oct 16 18:42:09 2010        (r213929)
+++ head/sys/net/rtsock.c       Sat Oct 16 19:25:27 2010        (r213930)
@@ -1473,6 +1473,7 @@ sysctl_iflist(int af, struct walkarg *w)
        TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
                if (w->w_arg && w->w_arg != ifp->if_index)
                        continue;
+               IF_ADDR_LOCK(ifp);
                ifa = ifp->if_addr;
                info.rti_info[RTAX_IFP] = ifa->ifa_addr;
                len = rt_msg2(RTM_IFINFO, &info, NULL, w);
@@ -1530,10 +1531,13 @@ sysctl_iflist(int af, struct walkarg *w)
                                        goto done;
                        }
                }
+               IF_ADDR_UNLOCK(ifp);
                info.rti_info[RTAX_IFA] = info.rti_info[RTAX_NETMASK] =
                        info.rti_info[RTAX_BRD] = NULL;
        }
 done:
+       if (ifp != NULL)
+               IF_ADDR_UNLOCK(ifp);
        IFNET_RUNLOCK();
        return (error);
 }
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to