Author: bz
Date: Sun Apr 11 18:41:31 2010
New Revision: 206486
URL: http://svn.freebsd.org/changeset/base/206486

Log:
  Check that the interface is on the list of cloned interfaces before trying
  to remove it to avoid panics in case of two threads trying to remove it in
  parallel.
  
  PR:           kern/116837
  Submitted by: Takahiro Kurosawa (takahiro.kurosawa gmail.com) (orig version)
  MFC after:    10 days

Modified:
  head/sys/net/if_clone.c

Modified: head/sys/net/if_clone.c
==============================================================================
--- head/sys/net/if_clone.c     Sun Apr 11 16:28:10 2010        (r206485)
+++ head/sys/net/if_clone.c     Sun Apr 11 18:41:31 2010        (r206486)
@@ -234,6 +234,7 @@ int
 if_clone_destroyif(struct if_clone *ifc, struct ifnet *ifp)
 {
        int err;
+       struct ifnet *ifcifp;
 
        if (ifc->ifc_destroy == NULL)
                return(EOPNOTSUPP);
@@ -246,8 +247,17 @@ if_clone_destroyif(struct if_clone *ifc,
        CURVNET_SET_QUIET(ifp->if_vnet);
 
        IF_CLONE_LOCK(ifc);
-       IFC_IFLIST_REMOVE(ifc, ifp);
+       LIST_FOREACH(ifcifp, &ifc->ifc_iflist, if_clones) {
+               if (ifcifp == ifp) {
+                       IFC_IFLIST_REMOVE(ifc, ifp);
+                       break;
+               }
+       }
        IF_CLONE_UNLOCK(ifc);
+       if (ifcifp == NULL) {
+               CURVNET_RESTORE();
+               return (ENXIO);         /* ifp is not on the list. */
+       }
 
        if_delgroup(ifp, ifc->ifc_name);
 
_______________________________________________
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