Do not attempt to clean up data that has not been initialized yet.

This fixes two kernel panics on boot when the xl driver fails to
allocate bus/port/memory resources.

Reviewed by:	silence on -net
This commit is contained in:
Peter Pentchev 2004-08-06 09:08:33 +00:00
parent 5355286a0a
commit 3f35d5150b
2 changed files with 19 additions and 6 deletions

View File

@ -518,6 +518,8 @@ if_detach(struct ifnet *ifp)
int s; int s;
int i; int i;
struct domain *dp; struct domain *dp;
struct ifnet *iter;
int found;
EVENTHANDLER_INVOKE(ifnet_departure_event, ifp); EVENTHANDLER_INVOKE(ifnet_departure_event, ifp);
/* /*
@ -584,9 +586,11 @@ if_detach(struct ifnet *ifp)
/* We can now free link ifaddr. */ /* We can now free link ifaddr. */
ifa = TAILQ_FIRST(&ifp->if_addrhead); if (!TAILQ_EMPTY(&ifp->if_addrhead)) {
TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link); ifa = TAILQ_FIRST(&ifp->if_addrhead);
IFAFREE(ifa); TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
IFAFREE(ifa);
}
/* /*
* Delete all remaining routes using this interface * Delete all remaining routes using this interface
@ -618,7 +622,14 @@ if_detach(struct ifnet *ifp)
#endif /* MAC */ #endif /* MAC */
KNOTE(&ifp->if_klist, NOTE_EXIT); KNOTE(&ifp->if_klist, NOTE_EXIT);
IFNET_WLOCK(); 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(); IFNET_WUNLOCK();
mtx_destroy(&ifp->if_snd.ifq_mtx); mtx_destroy(&ifp->if_snd.ifq_mtx);
IF_AFDATA_DESTROY(ifp); IF_AFDATA_DESTROY(ifp);

View File

@ -3169,7 +3169,8 @@ xl_stop(struct xl_softc *sc)
sc->xl_cdata.xl_rx_chain[i].xl_mbuf = NULL; sc->xl_cdata.xl_rx_chain[i].xl_mbuf = NULL;
} }
} }
bzero(sc->xl_ldata.xl_rx_list, XL_RX_LIST_SZ); if (sc->xl_ldata.xl_rx_list != NULL)
bzero(sc->xl_ldata.xl_rx_list, XL_RX_LIST_SZ);
/* /*
* Free the TX list buffers. * Free the TX list buffers.
*/ */
@ -3183,7 +3184,8 @@ xl_stop(struct xl_softc *sc)
sc->xl_cdata.xl_tx_chain[i].xl_mbuf = NULL; sc->xl_cdata.xl_tx_chain[i].xl_mbuf = NULL;
} }
} }
bzero(sc->xl_ldata.xl_tx_list, XL_TX_LIST_SZ); if (sc->xl_ldata.xl_tx_list != NULL)
bzero(sc->xl_ldata.xl_tx_list, XL_TX_LIST_SZ);
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
} }