svn commit: r213930 - head/sys/net

Bjoern A. Zeeb bz at FreeBSD.org
Sat Oct 16 19:25:27 UTC 2010


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);
 }


More information about the svn-src-head mailing list