summaryrefslogtreecommitdiffstats
path: root/sys/net/if_tap.c
diff options
context:
space:
mode:
authorpeadar <peadar@FreeBSD.org>2005-05-25 13:52:03 +0000
committerpeadar <peadar@FreeBSD.org>2005-05-25 13:52:03 +0000
commit5a3d27ed916b9040827bc3a4fc4941a367cecb7a (patch)
treeec407899089c3cc76e163fbb1d4c3ffed469e84e /sys/net/if_tap.c
parent3aa321bbac286b07d3daff1e77abb0b78294eb48 (diff)
downloadFreeBSD-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.c19
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);
OpenPOWER on IntegriCloud