diff options
Diffstat (limited to 'sys/net/if.c')
-rw-r--r-- | sys/net/if.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/sys/net/if.c b/sys/net/if.c index 0944d44..9f560d3 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -518,6 +518,8 @@ if_detach(struct ifnet *ifp) int s; int i; struct domain *dp; + struct ifnet *iter; + int found; EVENTHANDLER_INVOKE(ifnet_departure_event, ifp); /* @@ -584,9 +586,11 @@ if_detach(struct ifnet *ifp) /* We can now free link ifaddr. */ - ifa = TAILQ_FIRST(&ifp->if_addrhead); - TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link); - IFAFREE(ifa); + if (!TAILQ_EMPTY(&ifp->if_addrhead)) { + ifa = TAILQ_FIRST(&ifp->if_addrhead); + TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link); + IFAFREE(ifa); + } /* * Delete all remaining routes using this interface @@ -618,7 +622,14 @@ if_detach(struct ifnet *ifp) #endif /* MAC */ KNOTE(&ifp->if_klist, NOTE_EXIT); IFNET_WLOCK(); - TAILQ_REMOVE(&ifnet, ifp, if_link); + found = 0; + TAILQ_FOREACH(iter, &ifnet, if_link) + if (iter == ifp) { + found = 1; + break; + } + if (found) + TAILQ_REMOVE(&ifnet, ifp, if_link); IFNET_WUNLOCK(); mtx_destroy(&ifp->if_snd.ifq_mtx); IF_AFDATA_DESTROY(ifp); |