summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/net/route.c4
-rw-r--r--sys/netinet6/nd6.c4
2 files changed, 6 insertions, 2 deletions
diff --git a/sys/net/route.c b/sys/net/route.c
index 209d9c7..087eaa2 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -1304,16 +1304,18 @@ rt_check(struct rtentry **lrt, struct rtentry **lrt0, struct sockaddr *dst)
if ((rt->rt_flags & RTF_UP) == 0) {
RTFREE_LOCKED(rt); /* unlock gwroute */
rt = rt0;
+ rt0->rt_gwroute = NULL;
lookup:
RT_UNLOCK(rt0);
rt = rtalloc1(rt->rt_gateway, 1, 0UL);
if (rt == rt0) {
- rt0->rt_gwroute = NULL;
RT_REMREF(rt0);
RT_UNLOCK(rt0);
return (ENETUNREACH);
}
RT_LOCK(rt0);
+ if (rt0->rt_gwroute != NULL)
+ RTFREE(rt0->rt_gwroute);
rt0->rt_gwroute = rt;
if (rt == NULL) {
RT_UNLOCK(rt0);
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index 04d1f13..6fce084 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -1978,16 +1978,18 @@ again:
if ((rt->rt_flags & RTF_UP) == 0) {
RTFREE_LOCKED(rt); /* unlock gwroute */
rt = rt0;
+ rt0->rt_gwroute = NULL;
lookup:
RT_UNLOCK(rt0);
rt = rtalloc1(rt->rt_gateway, 1, 0UL);
if (rt == rt0) {
- rt0->rt_gwroute = NULL;
RT_REMREF(rt0);
RT_UNLOCK(rt0);
senderr(EHOSTUNREACH);
}
RT_LOCK(rt0);
+ if (rt0->rt_gwroute != NULL)
+ RTFREE(rt0->rt_gwroute);
rt0->rt_gwroute = rt;
if (rt == NULL) {
RT_UNLOCK(rt0);
OpenPOWER on IntegriCloud