diff options
-rw-r--r-- | sys/net/route.c | 22 | ||||
-rw-r--r-- | sys/net/rtsock.c | 3 | ||||
-rw-r--r-- | sys/netinet6/in6.c | 6 | ||||
-rw-r--r-- | sys/netinet6/nd6_rtr.c | 18 |
4 files changed, 10 insertions, 39 deletions
diff --git a/sys/net/route.c b/sys/net/route.c index 260f375..41f1335 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -566,6 +566,8 @@ rtrequest1(req, info, ret_nrt) if (rn->rn_flags & (RNF_ACTIVE | RNF_ROOT)) panic ("rtrequest delete"); rt = (struct rtentry *)rn; + rt->rt_refcnt++; + rt->rt_flags &= ~RTF_UP; /* * Now search what's left of the subtree for any cloned @@ -589,15 +591,6 @@ rtrequest1(req, info, ret_nrt) } /* - * NB: RTF_UP must be set during the search above, - * because we might delete the last ref, causing - * rt to get freed prematurely. - * eh? then why not just add a reference? - * I'm not sure how RTF_UP helps matters. (JRE) - */ - rt->rt_flags &= ~RTF_UP; - - /* * give the protocol a chance to keep things in sync. */ if ((ifa = rt->rt_ifa) && ifa->ifa_rtrequest) @@ -616,10 +609,8 @@ rtrequest1(req, info, ret_nrt) */ if (ret_nrt) *ret_nrt = rt; - else if (rt->rt_refcnt <= 0) { - rt->rt_refcnt++; /* make a 1->0 transition */ - rtfree(rt); - } + else + RTFREE(rt); break; case RTM_RESOLVE: @@ -1137,10 +1128,7 @@ bad: * If we are deleting, and we found an entry, then * it's been removed from the tree.. now throw it away. */ - if (rt->rt_refcnt <= 0) { - rt->rt_refcnt++; /* make a 1->0 transition */ - rtfree(rt); - } + RTFREE(rt); } else if (cmd == RTM_ADD) { /* * We just wanted to add it.. we don't actually diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 0c441ef..25276d7 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -356,8 +356,7 @@ route_output(m, so) case RTM_DELETE: error = rtrequest1(RTM_DELETE, &info, &saved_nrt); if (error == 0) { - if ((rt = saved_nrt)) - rt->rt_refcnt++; + rt = saved_nrt; goto report; } break; diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index c450dea..945ab65 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -197,11 +197,7 @@ in6_ifloop_request(int cmd, struct ifaddr *ifa) if (nrt) { rt_newaddrmsg(cmd, ifa, e, nrt); if (cmd == RTM_DELETE) { - if (nrt->rt_refcnt <= 0) { - /* XXX: we should free the entry ourselves. */ - nrt->rt_refcnt++; - rtfree(nrt); - } + RTFREE(nrt); } else { /* the cmd must be RTM_ADD here */ nrt->rt_refcnt--; diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index c920636..338a00c 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -574,14 +574,7 @@ defrouter_delreq(dr, dofree) RTF_GATEWAY, &oldrt); if (oldrt) { nd6_rtmsg(RTM_DELETE, oldrt); - if (oldrt->rt_refcnt <= 0) { - /* - * XXX: borrowed from the RTM_DELETE case of - * rtrequest(). - */ - oldrt->rt_refcnt++; - rtfree(oldrt); - } + RTFREE(oldrt); } if (dofree) /* XXX: necessary? */ @@ -1583,13 +1576,8 @@ nd6_prefix_offlink(pr) error)); } - if (rt != NULL) { - if (rt->rt_refcnt <= 0) { - /* XXX: we should free the entry ourselves. */ - rt->rt_refcnt++; - rtfree(rt); - } - } + if (rt != NULL) + RTFREE(rt); return(error); } |