diff options
author | peadar <peadar@FreeBSD.org> | 2005-05-25 13:52:03 +0000 |
---|---|---|
committer | peadar <peadar@FreeBSD.org> | 2005-05-25 13:52:03 +0000 |
commit | 5a3d27ed916b9040827bc3a4fc4941a367cecb7a (patch) | |
tree | ec407899089c3cc76e163fbb1d4c3ffed469e84e /sys/net/if_tap.c | |
parent | 3aa321bbac286b07d3daff1e77abb0b78294eb48 (diff) | |
download | FreeBSD-src-5a3d27ed916b9040827bc3a4fc4941a367cecb7a.zip FreeBSD-src-5a3d27ed916b9040827bc3a4fc4941a367cecb7a.tar.gz |
Separate out address-detaching part of if_detach into if_purgeaddrs,
so if_tap doesn't need to rely on locally-rolled code to do same.
The observable symptom of if_tap's bzero'ing the address details
was a crash in "ifconfig tap0" after an if_tap device was closed.
Reported By: Matti Saarinen (mjsaarin at cc dot helsinki dot fi)
Diffstat (limited to 'sys/net/if_tap.c')
-rw-r--r-- | sys/net/if_tap.c | 19 |
1 files changed, 3 insertions, 16 deletions
diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c index 2f7474b..dc76f44 100644 --- a/sys/net/if_tap.c +++ b/sys/net/if_tap.c @@ -408,6 +408,7 @@ tapclose(dev, foo, bar, td) int bar; struct thread *td; { + struct ifaddr *ifa; struct tap_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tap_if; int s; @@ -426,24 +427,10 @@ tapclose(dev, foo, bar, td) s = splimp(); if_down(ifp); if (ifp->if_flags & IFF_RUNNING) { - /* find internet addresses and delete routes */ - struct ifaddr *ifa = NULL; - - /* In desparate need of ifaddr locking. */ TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { - if (ifa->ifa_addr->sa_family == AF_INET) { - rtinit(ifa, (int)RTM_DELETE, 0); - - /* remove address from interface */ - bzero(ifa->ifa_addr, - sizeof(*(ifa->ifa_addr))); - bzero(ifa->ifa_dstaddr, - sizeof(*(ifa->ifa_dstaddr))); - bzero(ifa->ifa_netmask, - sizeof(*(ifa->ifa_netmask))); - } + rtinit(ifa, (int)RTM_DELETE, 0); } - + if_purgeaddrs(ifp); ifp->if_flags &= ~IFF_RUNNING; } splx(s); |