summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2009-01-31 10:48:02 +0000
committerbz <bz@FreeBSD.org>2009-01-31 10:48:02 +0000
commit226b2a700eecfdf598bf77f229d3a378d11844b4 (patch)
treedb9d96c3d46e2dd5b8ccaa93c6188a5c52063c79
parente2a805f19f85cd20079a30f6532e261f7c2ebe1d (diff)
downloadFreeBSD-src-226b2a700eecfdf598bf77f229d3a378d11844b4.zip
FreeBSD-src-226b2a700eecfdf598bf77f229d3a378d11844b4.tar.gz
Like with r185713 make sure to not leak a lock as rtalloc1(9) returns
a locked route. Thus we have to use RTFREE_LOCKED(9) to get it unlocked and rtfree(9)d rather than just rtfree(9)d. Since the PR was filed, new places with the same problem were added with new code. Also check that the rt is valid before freeing it either way there. PR: kern/129793 Submitted by: Dheeraj Reddy <dheeraj@ece.gatech.edu> MFC after: 2 weeks Committed from: Bugathon #6
-rw-r--r--sys/net/if_llatbl.c5
-rw-r--r--sys/netinet6/in6.c6
-rw-r--r--sys/netinet6/in6_gif.c4
-rw-r--r--sys/netinet6/in6_ifattach.c2
-rw-r--r--sys/netinet6/nd6_nbr.c2
5 files changed, 10 insertions, 9 deletions
diff --git a/sys/net/if_llatbl.c b/sys/net/if_llatbl.c
index a3d1b05..2287f92 100644
--- a/sys/net/if_llatbl.c
+++ b/sys/net/if_llatbl.c
@@ -219,10 +219,11 @@ lla_rt_output(struct rt_msghdr *rtm, struct rt_addrinfo *info)
log(LOG_INFO, "%s: RTM_ADD publish "
"(proxy only) is invalid\n",
__func__);
- RTFREE(rt);
+ if (rt)
+ RTFREE_LOCKED(rt);
return EINVAL;
}
- RTFREE(rt);
+ RTFREE_LOCKED(rt);
flags |= LLE_PROXY;
}
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index fc0333b..693a2f9 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -2122,16 +2122,16 @@ in6_lltable_rtcheck(struct ifnet *ifp, const struct sockaddr *l3addr)
ifa = ifaof_ifpforaddr(__DECONST(struct sockaddr *, l3addr), ifp);
if (ifa != NULL) {
if (rt != NULL)
- rtfree(rt);
+ RTFREE_LOCKED(rt);
return 0;
}
log(LOG_INFO, "IPv6 address: \"%s\" is not on the network\n",
ip6_sprintf(ip6buf, &((const struct sockaddr_in6 *)l3addr)->sin6_addr));
if (rt != NULL)
- rtfree(rt);
+ RTFREE_LOCKED(rt);
return EINVAL;
}
- rtfree(rt);
+ RTFREE_LOCKED(rt);
return 0;
}
diff --git a/sys/netinet6/in6_gif.c b/sys/netinet6/in6_gif.c
index 3e17819..bba348f 100644
--- a/sys/netinet6/in6_gif.c
+++ b/sys/netinet6/in6_gif.c
@@ -378,10 +378,10 @@ gif_validate6(const struct ip6_hdr *ip6, struct gif_softc *sc,
ip6_sprintf(ip6buf, &sin6.sin6_addr));
#endif
if (rt)
- rtfree(rt);
+ RTFREE_LOCKED(rt);
return 0;
}
- rtfree(rt);
+ RTFREE_LOCKED(rt);
}
return 128 * 2;
diff --git a/sys/netinet6/in6_ifattach.c b/sys/netinet6/in6_ifattach.c
index 292501d..ca5428d 100644
--- a/sys/netinet6/in6_ifattach.c
+++ b/sys/netinet6/in6_ifattach.c
@@ -778,7 +778,7 @@ in6_ifdetach(struct ifnet *ifp)
if ((ia->ia_flags & IFA_ROUTE) &&
(rt = rtalloc1((struct sockaddr *)&ia->ia_addr, 0, 0UL))) {
rtflags = rt->rt_flags;
- rtfree(rt);
+ RTFREE_LOCKED(rt);
rtrequest(RTM_DELETE, (struct sockaddr *)&ia->ia_addr,
(struct sockaddr *)&ia->ia_addr,
(struct sockaddr *)&ia->ia_prefixmask,
diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c
index 84e415a..1f88fb1 100644
--- a/sys/netinet6/nd6_nbr.c
+++ b/sys/netinet6/nd6_nbr.c
@@ -259,7 +259,7 @@ nd6_ns_input(struct mbuf *m, int off, int icmp6len)
need_proxy = (rt && (rt->rt_flags & RTF_ANNOUNCE) != 0 &&
rt->rt_gateway->sa_family == AF_LINK);
if (rt)
- rtfree(rt);
+ RTFREE_LOCKED(rt);
if (need_proxy) {
/*
* proxy NDP for single entry
OpenPOWER on IntegriCloud