diff options
author | imp <imp@FreeBSD.org> | 2005-09-19 03:10:21 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2005-09-19 03:10:21 +0000 |
commit | 4e70215e6bf590140205774753c8b0a1f1fe9a36 (patch) | |
tree | c3358cebc77043ea8b2a3a5036b02dad6a674b7e /sys/dev/nve | |
parent | 37a0bbb7e543c6b2a2f055d676d5a94f781d7738 (diff) | |
download | FreeBSD-src-4e70215e6bf590140205774753c8b0a1f1fe9a36.zip FreeBSD-src-4e70215e6bf590140205774753c8b0a1f1fe9a36.tar.gz |
Make sure that we call if_free(ifp) after bus_teardown_intr. Since we
could get an interrupt after we free the ifp, and the interrupt
handler depended on the ifp being still alive, this could, in theory,
cause a crash. Eliminate this possibility by moving the if_free to
after the bus_teardown_intr() call.
Diffstat (limited to 'sys/dev/nve')
-rw-r--r-- | sys/dev/nve/if_nve.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/dev/nve/if_nve.c b/sys/dev/nve/if_nve.c index 0d8267a..6ffecbd 100644 --- a/sys/dev/nve/if_nve.c +++ b/sys/dev/nve/if_nve.c @@ -559,12 +559,10 @@ nve_detach(device_t dev) if (device_is_attached(dev)) { nve_stop(sc); + /* XXX shouldn't hold lock over call to ether_ifdetch */ ether_ifdetach(ifp); } - if (ifp) - if_free(ifp); - if (sc->miibus) device_delete_child(dev, sc->miibus); bus_generic_detach(dev); @@ -601,6 +599,8 @@ nve_detach(device_t dev) bus_dma_tag_destroy(sc->rtag); NVE_UNLOCK(sc); + if (ifp) + if_free(ifp); mtx_destroy(&sc->mtx); mtx_destroy(&sc->osmtx); |