diff options
-rw-r--r-- | sys/net/route.c | 4 | ||||
-rw-r--r-- | sys/netinet6/nd6.c | 4 |
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); |