tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[PATCH] invalidate pointers right after pool_put()



Hi,

attached patch invalidates pointers right after pool_put().
I'm running a machine with this patch for several month
w/o any problems.

Is it ok to commit?

Christoph
Index: nfs/nfs_node.c
===================================================================
RCS file: /cvsroot/src/sys/nfs/nfs_node.c,v
retrieving revision 1.110
diff -u -p -r1.110 nfs_node.c
--- nfs/nfs_node.c      15 Mar 2009 17:20:10 -0000      1.110
+++ nfs/nfs_node.c      28 Apr 2009 13:06:00 -0000
@@ -217,7 +217,9 @@ loop:
                        kmem_free(np->n_fhp, fhsize);
                }
                pool_put(&nfs_vattr_pool, np->n_vattr);
+               np->n_vattr = NULL;
                pool_put(&nfs_node_pool, np);
+               np = NULL;
                ungetnewvnode(vp);
                goto loop;
        }
@@ -312,6 +314,7 @@ nfs_reclaim(void *v)
                kmem_free(np->n_fhp, np->n_fhsize);
 
        pool_put(&nfs_vattr_pool, np->n_vattr);
+       np->n_vattr = NULL;
        if (np->n_rcred)
                kauth_cred_free(np->n_rcred);
 
@@ -324,6 +327,7 @@ nfs_reclaim(void *v)
        }
        genfs_node_destroy(vp);
        pool_put(&nfs_node_pool, np);
+       np = NULL;
        vp->v_data = NULL;
        return (0);
 }
Index: nfs/nfs_srvsocket.c
===================================================================
RCS file: /cvsroot/src/sys/nfs/nfs_srvsocket.c,v
retrieving revision 1.3
diff -u -p -r1.3 nfs_srvsocket.c
--- nfs/nfs_srvsocket.c 14 Mar 2009 15:36:24 -0000      1.3
+++ nfs/nfs_srvsocket.c 28 Apr 2009 13:06:00 -0000
@@ -396,6 +396,7 @@ nfsrv_dorec(struct nfssvc_sock *slp, str
        if (error) {
                m_freem(nam);
                nfsdreq_free(nd);
+               nd = NULL;
                return (error);
        }
        *ndp = nd;
@@ -500,6 +501,7 @@ again:
                m_free(nd->nd_nam2);
        }
        nfsdreq_free(nd);
+       nd = NULL;
 
        mutex_enter(&slp->ns_lock);
        KASSERT((slp->ns_flags & SLP_SENDING) != 0);
Index: nfs/nfs_syscalls.c
===================================================================
RCS file: /cvsroot/src/sys/nfs/nfs_syscalls.c,v
retrieving revision 1.147
diff -u -p -r1.147 nfs_syscalls.c
--- nfs/nfs_syscalls.c  10 Apr 2009 19:04:14 -0000      1.147
+++ nfs/nfs_syscalls.c  28 Apr 2009 13:06:00 -0000
@@ -771,6 +771,7 @@ nfsrv_zapsock(struct nfssvc_sock *slp)
                LIST_REMOVE(nwp, nd_tq);
                mutex_exit(&nfsd_lock);
                nfsdreq_free(nwp);
+               nwp = NULL;
                mutex_enter(&nfsd_lock);
        }
        mutex_exit(&nfsd_lock);
Index: net/if.c
===================================================================
RCS file: /cvsroot/src/sys/net/if.c,v
retrieving revision 1.233
diff -u -p -r1.233 if.c
--- net/if.c    12 Feb 2009 19:05:36 -0000      1.233
+++ net/if.c    28 Apr 2009 13:06:00 -0000
@@ -845,7 +845,7 @@ if_rt_walktree(struct rtentry *rt, void 
            rt_mask(rt), rt->rt_flags, NULL);
        KASSERT((rt->rt_flags & RTF_UP) == 0);
        rt->rt_ifp = NULL;
-       RTFREE(rt);
+       RTFREE(&rt);
        if (error != 0)
                printf("%s: warning: unable to delete rtentry @ %p, "
                    "error = %d\n", ifp->if_xname, rt, error);
Index: net/if_arcsubr.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_arcsubr.c,v
retrieving revision 1.60
diff -u -p -r1.60 if_arcsubr.c
--- net/if_arcsubr.c    7 Nov 2008 00:20:13 -0000       1.60
+++ net/if_arcsubr.c    28 Apr 2009 13:06:00 -0000
@@ -148,7 +148,7 @@ arc_output(struct ifnet *ifp, struct mbu
                        if (rt->rt_gwroute == 0)
                                goto lookup;
                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
+                               rtfree(&rt); rt = rt0;
                        lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1);
                                if ((rt = rt->rt_gwroute) == 0)
                                        senderr(EHOSTUNREACH);
Index: net/if_atmsubr.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_atmsubr.c,v
retrieving revision 1.46
diff -u -p -r1.46 if_atmsubr.c
--- net/if_atmsubr.c    18 Apr 2009 14:58:04 -0000      1.46
+++ net/if_atmsubr.c    28 Apr 2009 13:06:00 -0000
@@ -136,7 +136,7 @@ atm_output(struct ifnet *ifp, struct mbu
                        if (rt->rt_gwroute == 0)
                                goto lookup;
                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
+                               rtfree(&rt); rt = rt0;
                        lookup: rt->rt_gwroute = RTALLOC1(rt->rt_gateway, 0);
                                if ((rt = rt->rt_gwroute) == 0)
                                        senderr(EHOSTUNREACH);
Index: net/if_ecosubr.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_ecosubr.c,v
retrieving revision 1.32
diff -u -p -r1.32 if_ecosubr.c
--- net/if_ecosubr.c    18 Mar 2009 16:00:22 -0000      1.32
+++ net/if_ecosubr.c    28 Apr 2009 13:06:00 -0000
@@ -200,7 +200,7 @@ eco_output(struct ifnet *ifp, struct mbu
                        if (rt->rt_gwroute == 0)
                                goto lookup;
                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
+                               rtfree(&rt); rt = rt0;
                        lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1);
                                if ((rt = rt->rt_gwroute) == 0)
                                        senderr(EHOSTUNREACH);
Index: net/if_ethersubr.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_ethersubr.c,v
retrieving revision 1.170
diff -u -p -r1.170 if_ethersubr.c
--- net/if_ethersubr.c  7 Nov 2008 00:20:13 -0000       1.170
+++ net/if_ethersubr.c  28 Apr 2009 13:06:00 -0000
@@ -259,7 +259,7 @@ ether_output(struct ifnet *ifp0, struct 
                        if (rt->rt_gwroute == NULL)
                                goto lookup;
                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
+                               rtfree(&rt); rt = rt0;
                        lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1);
                                if ((rt = rt->rt_gwroute) == NULL)
                                        senderr(EHOSTUNREACH);
Index: net/if_fddisubr.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_fddisubr.c,v
retrieving revision 1.77
diff -u -p -r1.77 if_fddisubr.c
--- net/if_fddisubr.c   7 Nov 2008 00:20:13 -0000       1.77
+++ net/if_fddisubr.c   28 Apr 2009 13:06:00 -0000
@@ -253,7 +253,7 @@ fddi_output(struct ifnet *ifp0, struct m
                        if (rt->rt_gwroute == 0)
                                goto lookup;
                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
+                               rtfree(&rt); rt = rt0;
                        lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1);
                                if ((rt = rt->rt_gwroute) == 0)
                                        senderr(EHOSTUNREACH);
Index: net/if_hippisubr.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_hippisubr.c,v
retrieving revision 1.37
diff -u -p -r1.37 if_hippisubr.c
--- net/if_hippisubr.c  18 Apr 2009 14:58:05 -0000      1.37
+++ net/if_hippisubr.c  28 Apr 2009 13:06:00 -0000
@@ -119,7 +119,7 @@ hippi_output(struct ifnet *ifp, struct m
                        if (rt->rt_gwroute == 0)
                                goto lookup;
                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
+                               rtfree(&rt); rt = rt0;
                        lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1);
                                if ((rt = rt->rt_gwroute) == 0)
                                        senderr(EHOSTUNREACH);
Index: net/if_ieee1394subr.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_ieee1394subr.c,v
retrieving revision 1.41
diff -u -p -r1.41 if_ieee1394subr.c
--- net/if_ieee1394subr.c       7 Nov 2008 00:20:13 -0000       1.41
+++ net/if_ieee1394subr.c       28 Apr 2009 13:06:01 -0000
@@ -116,7 +116,7 @@ ieee1394_output(struct ifnet *ifp, struc
                        if (rt->rt_gwroute == NULL)
                                goto lookup;
                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt);
+                               rtfree(&rt);
                                rt = rt0;
   lookup:
                                rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1);
Index: net/if_stf.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_stf.c,v
retrieving revision 1.72
diff -u -p -r1.72 if_stf.c
--- net/if_stf.c        18 Apr 2009 14:58:05 -0000      1.72
+++ net/if_stf.c        28 Apr 2009 13:06:01 -0000
@@ -511,10 +511,10 @@ stf_checkaddr4(struct stf_softc *sc, con
                            (uint32_t)ntohl(sin.sin_addr.s_addr));
 #endif
                        if (rt)
-                               rtfree(rt);
+                               rtfree(&rt);
                        return -1;
                }
-               rtfree(rt);
+               rtfree(&rt);
        }
 
        return 0;
Index: net/if_tokensubr.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_tokensubr.c,v
retrieving revision 1.57
diff -u -p -r1.57 if_tokensubr.c
--- net/if_tokensubr.c  18 Apr 2009 14:58:05 -0000      1.57
+++ net/if_tokensubr.c  28 Apr 2009 13:06:01 -0000
@@ -230,7 +230,7 @@ token_output(struct ifnet *ifp0, struct 
                        if (rt->rt_gwroute == 0)
                                goto lookup;
                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
+                               rtfree(&rt); rt = rt0;
                        lookup: rt->rt_gwroute = RTALLOC1(rt->rt_gateway, 1);
                                if ((rt = rt->rt_gwroute) == 0)
                                        senderr(EHOSTUNREACH);
Index: net/route.c
===================================================================
RCS file: /cvsroot/src/sys/net/route.c,v
retrieving revision 1.117
diff -u -p -r1.117 route.c
--- net/route.c 2 Apr 2009 21:02:06 -0000       1.117
+++ net/route.c 28 Apr 2009 13:06:01 -0000
@@ -358,10 +358,15 @@ rtalloc1(const struct sockaddr *dst, int
 }
 
 void
-rtfree(struct rtentry *rt)
+rtfree(struct rtentry **_rt)
 {
        struct ifaddr *ifa;
+       struct rtentry *rt;
+
+       if (_rt == NULL)
+               panic("rtfree");
 
+       rt = *_rt;
        if (rt == NULL)
                panic("rtfree");
        rt->rt_refcnt--;
@@ -380,6 +385,7 @@ rtfree(struct rtentry *rt)
                rt->rt_ifp = NULL;
                rt_destroy(rt);
                pool_put(&rtentry_pool, rt);
+               _rt = NULL;
        }
 }
 
@@ -457,7 +463,7 @@ rtredirect(const struct sockaddr *dst, c
                         */
                create:
                        if (rt != NULL)
-                               rtfree(rt);
+                               rtfree(&rt);
                        flags |=  RTF_GATEWAY | RTF_DYNAMIC;
                        info.rti_info[RTAX_DST] = dst;
                        info.rti_info[RTAX_GATEWAY] = gateway;
@@ -486,7 +492,7 @@ done:
                if (rtp != NULL && !error)
                        *rtp = rt;
                else
-                       rtfree(rt);
+                       rtfree(&rt);
        }
 out:
        if (error)
@@ -527,7 +533,7 @@ rtdeletemsg(struct rtentry *rt)
        /* Adjust the refcount */
        if (error == 0 && rt->rt_refcnt <= 0) {
                rt->rt_refcnt++;
-               rtfree(rt);
+               rtfree(&rt);
        }
        return error;
 }
@@ -703,7 +709,7 @@ rtrequest1(int req, struct rt_addrinfo *
                        panic ("rtrequest delete");
                rt = (struct rtentry *)rn;
                if (rt->rt_gwroute) {
-                       RTFREE(rt->rt_gwroute);
+                       RTFREE(&rt->rt_gwroute);
                        rt->rt_gwroute = NULL;
                }
                if (rt->rt_parent) {
@@ -727,7 +733,7 @@ rtrequest1(int req, struct rt_addrinfo *
                        *ret_nrt = rt;
                else if (rt->rt_refcnt <= 0) {
                        rt->rt_refcnt++;
-                       rtfree(rt);
+                       rtfree(&rt);
                }
                break;
 
@@ -759,6 +765,7 @@ rtrequest1(int req, struct rt_addrinfo *
                if (rt_setkey(rt, dst, M_NOWAIT) == NULL ||
                    rt_setgate(rt, gateway) != 0) {
                        pool_put(&rtentry_pool, rt);
+                       rt = NULL;
                        senderr(ENOBUFS);
                }
                RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key);
@@ -790,18 +797,21 @@ rtrequest1(int req, struct rt_addrinfo *
                                rn = rnh->rnh_addaddr(rt_getkey(rt),
                                    netmask, rnh, rt->rt_nodes);
                        }
-                       RTFREE(crt);
+                       RTFREE(&crt);
                        RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key);
                }
                RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key);
                if (rn == NULL) {
                        IFAFREE(ifa);
-                       if ((rt->rt_flags & RTF_CLONED) != 0 && rt->rt_parent)
-                               rtfree(rt->rt_parent);
-                       if (rt->rt_gwroute)
-                               rtfree(rt->rt_gwroute);
+                       if ((rt->rt_flags & RTF_CLONED) != 0 && rt->rt_parent) {
+                               rtfree(&rt->rt_parent);
+                       }
+                       if (rt->rt_gwroute) {
+                               rtfree(&rt->rt_gwroute);
+                       }
                        rt_destroy(rt);
                        pool_put(&rtentry_pool, rt);
+                       rt = NULL;
                        senderr(EEXIST);
                }
                RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key);
@@ -848,7 +858,7 @@ rt_setgate(struct rtentry *rt, const str
        RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key);
 
        if (rt->rt_gwroute) {
-               RTFREE(rt->rt_gwroute);
+               RTFREE(&rt->rt_gwroute);
                rt->rt_gwroute = NULL;
        }
        KASSERT(rt->_rt_key != NULL);
@@ -959,7 +969,7 @@ rtinit(struct ifaddr *ifa, int cmd, int 
                rt_newaddrmsg(cmd, ifa, error, nrt);
                if (rt->rt_refcnt <= 0) {
                        rt->rt_refcnt++;
-                       rtfree(rt);
+                       rtfree(&rt);
                }
                break;
        case RTM_LLINFO_UPD:
@@ -1081,6 +1091,7 @@ rt_timer_queue_remove_all(struct rttimer
                        RTTIMER_CALLOUT(r);
                /* we are already at splsoftnet */
                pool_put(&rttimer_pool, r);
+               r = NULL;
                if (rtq->rtq_count > 0)
                        rtq->rtq_count--;
                else
@@ -1124,6 +1135,7 @@ rt_timer_remove_all(struct rtentry *rt, 
                        printf("rt_timer_remove_all: rtq_count reached 0\n");
                /* we are already at splsoftnet */
                pool_put(&rttimer_pool, r);
+               r = NULL;
        }
 }
 
@@ -1187,6 +1199,7 @@ rt_timer_timer(void *arg)
                        TAILQ_REMOVE(&rtq->rtq_head, r, rtt_next);
                        RTTIMER_CALLOUT(r);
                        pool_put(&rttimer_pool, r);
+                       r = NULL;
                        if (rtq->rtq_count > 0)
                                rtq->rtq_count--;
                        else
@@ -1281,7 +1294,7 @@ rtcache_clear(struct route *ro)
 
        LIST_REMOVE(ro, ro_rtcache_next);
 
-       RTFREE(ro->_ro_rt);
+       RTFREE(&ro->_ro_rt);
        ro->_ro_rt = NULL;
        ro->ro_invalid = false;
        rtcache_invariants(ro);
Index: net/route.h
===================================================================
RCS file: /cvsroot/src/sys/net/route.h,v
retrieving revision 1.73
diff -u -p -r1.73 route.h
--- net/route.h 2 Apr 2009 21:02:06 -0000       1.73
+++ net/route.h 28 Apr 2009 13:06:01 -0000
@@ -368,7 +368,7 @@ void         rtcache(struct route *);
 void    rtflushall(int);
 struct rtentry *
         rtalloc1(const struct sockaddr *, int);
-void    rtfree(struct rtentry *);
+void    rtfree(struct rtentry **);
 int     rt_getifa(struct rt_addrinfo *);
 int     rtinit(struct ifaddr *, int, int);
 int     rtioctl(u_long, void *, struct lwp *);
@@ -477,12 +477,12 @@ rtcache_validate(const struct route *ro)
 }
 
 static inline void
-RTFREE(struct rtentry *rt)
+RTFREE(struct rtentry **rt)
 {
-       if (rt->rt_refcnt <= 1)
+       if ((*rt)->rt_refcnt <= 1)
                rtfree(rt);
        else
-               rt->rt_refcnt--;
+               (*rt)->rt_refcnt--;
 }
 
 int
Index: net/rtsock.c
===================================================================
RCS file: /cvsroot/src/sys/net/rtsock.c,v
retrieving revision 1.125
diff -u -p -r1.125 rtsock.c
--- net/rtsock.c        2 Apr 2009 21:02:06 -0000       1.125
+++ net/rtsock.c        28 Apr 2009 13:06:01 -0000
@@ -462,7 +462,7 @@ flush:
        if (old_rtm != NULL)
                Free(old_rtm);
        if (rt)
-               rtfree(rt);
+               rtfree(&rt);
     {
        struct rawcb *rp = NULL;
        /*
Index: netinet/in_gif.c
===================================================================
RCS file: /cvsroot/src/sys/netinet/in_gif.c,v
retrieving revision 1.60
diff -u -p -r1.60 in_gif.c
--- netinet/in_gif.c    7 Nov 2008 00:20:18 -0000       1.60
+++ netinet/in_gif.c    28 Apr 2009 13:06:01 -0000
@@ -337,10 +337,10 @@ gif_validate4(const struct ip *ip, struc
                            (u_int32_t)ntohl(u.sin.sin_addr.s_addr));
 #endif
                        if (rt != NULL)
-                               rtfree(rt);
+                               rtfree(&rt);
                        return 0;
                }
-               rtfree(rt);
+               rtfree(&rt);
        }
 
        return 32 * 2;
Index: netinet/ip_icmp.c
===================================================================
RCS file: /cvsroot/src/sys/netinet/ip_icmp.c,v
retrieving revision 1.120
diff -u -p -r1.120 ip_icmp.c
--- netinet/ip_icmp.c   18 Jun 2008 09:06:28 -0000      1.120
+++ netinet/ip_icmp.c   28 Apr 2009 13:06:01 -0000
@@ -629,7 +629,7 @@ reflect:
                                    icp->icmp_ip.ip_dst.s_addr, i);
                }
                if (rt != NULL)
-                       rtfree(rt);
+                       rtfree(&rt);
 
                pfctlinput(PRC_REDIRECT_HOST, sintosa(&icmpsrc));
 #if defined(IPSEC) || defined(FAST_IPSEC)
@@ -1090,16 +1090,16 @@ icmp_mtudisc(struct icmp *icp, struct in
                    (struct sockaddr *) 0,
                    RTF_GATEWAY | RTF_HOST | RTF_DYNAMIC, &nrt);
                if (error) {
-                       rtfree(rt);
+                       rtfree(&rt);
                        return;
                }
                nrt->rt_rmx = rt->rt_rmx;
-               rtfree(rt);
+               rtfree(&rt);
                rt = nrt;
        }
        error = rt_timer_add(rt, icmp_mtudisc_timeout, ip_mtudisc_timeout_q);
        if (error) {
-               rtfree(rt);
+               rtfree(&rt);
                return;
        }
 
@@ -1148,7 +1148,7 @@ icmp_mtudisc(struct icmp *icp, struct in
        }
 
        if (rt)
-               rtfree(rt);
+               rtfree(&rt);
 
        /*
         * Notify protocols that the MTU for this destination
Index: netinet6/icmp6.c
===================================================================
RCS file: /cvsroot/src/sys/netinet6/icmp6.c,v
retrieving revision 1.152
diff -u -p -r1.152 icmp6.c
--- netinet6/icmp6.c    18 Mar 2009 16:00:22 -0000      1.152
+++ netinet6/icmp6.c    28 Apr 2009 13:06:01 -0000
@@ -1134,7 +1134,7 @@ icmp6_mtudisc_update(struct ip6ctlparam 
                }
        }
        if (rt) { /* XXX: need braces to avoid conflict with else in RTFREE. */
-               RTFREE(rt);
+               RTFREE(&rt);
        }
 
        /*
@@ -2192,7 +2192,7 @@ icmp6_redirect_input(struct mbuf *m, int
                            "ICMP6 redirect rejected; no route "
                            "with inet6 gateway found for redirect dst: %s\n",
                            icmp6_redirect_diag(&src6, &reddst6, &redtgt6)));
-                       RTFREE(rt);
+                       RTFREE(&rt);
                        goto bad;
                }
 
@@ -2204,7 +2204,7 @@ icmp6_redirect_input(struct mbuf *m, int
                                "%s\n",
                                ip6_sprintf(gw6),
                                icmp6_redirect_diag(&src6, &reddst6, 
&redtgt6)));
-                       RTFREE(rt);
+                       RTFREE(&rt);
                        goto bad;
                }
        } else {
@@ -2214,7 +2214,7 @@ icmp6_redirect_input(struct mbuf *m, int
                        icmp6_redirect_diag(&src6, &reddst6, &redtgt6)));
                goto bad;
        }
-       RTFREE(rt);
+       RTFREE(&rt);
        rt = NULL;
     }
        if (IN6_IS_ADDR_MULTICAST(&reddst6)) {
@@ -2308,7 +2308,7 @@ icmp6_redirect_input(struct mbuf *m, int
                if (newrt) {
                        (void)rt_timer_add(newrt, icmp6_redirect_timeout,
                            icmp6_redirect_timeout_q);
-                       rtfree(newrt);
+                       rtfree(&newrt);
                }
        }
        /* finally update cached route in each socket via pfctlinput */
@@ -2687,17 +2687,17 @@ icmp6_mtudisc_clone(struct sockaddr *dst
                    (struct sockaddr *) 0,
                    RTF_GATEWAY | RTF_HOST | RTF_DYNAMIC, &nrt);
                if (error) {
-                       rtfree(rt);
+                       rtfree(&rt);
                        return NULL;
                }
                nrt->rt_rmx = rt->rt_rmx;
-               rtfree(rt);
+               rtfree(&rt);
                rt = nrt;
        }
        error = rt_timer_add(rt, icmp6_mtudisc_timeout,
                        icmp6_mtudisc_timeout_q);
        if (error) {
-               rtfree(rt);
+               rtfree(&rt);
                return NULL;
        }
 
Index: netinet6/in6.c
===================================================================
RCS file: /cvsroot/src/sys/netinet6/in6.c,v
retrieving revision 1.150
diff -u -p -r1.150 in6.c
--- netinet6/in6.c      18 Apr 2009 14:58:05 -0000      1.150
+++ netinet6/in6.c      28 Apr 2009 13:06:02 -0000
@@ -201,7 +201,7 @@ in6_ifloop_request(int cmd, struct ifadd
                        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 */
@@ -1137,7 +1137,7 @@ in6_update_ifa1(struct ifnet *ifp, struc
                        if (memcmp(&mltaddr.sin6_addr,
                            &satocsin6(rt_getkey(rt))->sin6_addr,
                            MLTMASK_LEN)) {
-                               RTFREE(rt);
+                               RTFREE(&rt);
                                rt = NULL;
                        } else if (rt->rt_ifp != ifp) {
                                IN6_DPRINTF("%s: rt_ifp %p -> %p (%s) "
@@ -1168,7 +1168,7 @@ in6_update_ifa1(struct ifnet *ifp, struc
                        if (error)
                                goto cleanup;
                } else {
-                       RTFREE(rt);
+                       RTFREE(&rt);
                }
                imm = in6_joingroup(ifp, &mltaddr.sin6_addr, &error, 0);
                if (!imm) {
@@ -1222,7 +1222,7 @@ in6_update_ifa1(struct ifnet *ifp, struc
                        if (memcmp(&mltaddr.sin6_addr,
                            &satocsin6(rt_getkey(rt))->sin6_addr,
                            32 / NBBY)) {
-                               RTFREE(rt);
+                               RTFREE(&rt);
                                rt = NULL;
                        } else if (rt->rt_ifp != ifp) {
                                IN6_DPRINTF("%s: rt_ifp %p -> %p (%s) "
@@ -1253,7 +1253,7 @@ in6_update_ifa1(struct ifnet *ifp, struc
                                goto cleanup;
 #undef MLTMASK_LEN
                } else {
-                       RTFREE(rt);
+                       RTFREE(&rt);
                }
                imm = in6_joingroup(ifp, &mltaddr.sin6_addr, &error, 0);
                if (!imm) {
Index: netinet6/in6_gif.c
===================================================================
RCS file: /cvsroot/src/sys/netinet6/in6_gif.c,v
retrieving revision 1.58
diff -u -p -r1.58 in6_gif.c
--- netinet6/in6_gif.c  14 Mar 2009 14:46:10 -0000      1.58
+++ netinet6/in6_gif.c  28 Apr 2009 13:06:02 -0000
@@ -329,10 +329,10 @@ gif_validate6(const struct ip6_hdr *ip6,
                            ip6_sprintf(&u.sin6.sin6_addr));
 #endif
                        if (rt != NULL)
-                               rtfree(rt);
+                               rtfree(&rt);
                        return 0;
                }
-               rtfree(rt);
+               rtfree(&rt);
        }
 
        return 128 * 2;
Index: netinet6/in6_ifattach.c
===================================================================
RCS file: /cvsroot/src/sys/netinet6/in6_ifattach.c,v
retrieving revision 1.81
diff -u -p -r1.81 in6_ifattach.c
--- netinet6/in6_ifattach.c     7 Nov 2008 00:20:18 -0000       1.81
+++ netinet6/in6_ifattach.c     28 Apr 2009 13:06:02 -0000
@@ -884,7 +884,7 @@ in6_ifdetach(struct ifnet *ifp)
                if ((ia->ia_flags & IFA_ROUTE) &&
                    (rt = rtalloc1((struct sockaddr *)&ia->ia_addr, 0))) {
                        rtflags = rt->rt_flags;
-                       rtfree(rt);
+                       rtfree(&rt);
                        rtrequest(RTM_DELETE, (struct sockaddr *)&ia->ia_addr,
                            (struct sockaddr *)&ia->ia_addr,
                            (struct sockaddr *)&ia->ia_prefixmask,
Index: netinet6/nd6.c
===================================================================
RCS file: /cvsroot/src/sys/netinet6/nd6.c,v
retrieving revision 1.131
diff -u -p -r1.131 nd6.c
--- netinet6/nd6.c      7 Nov 2008 00:20:18 -0000       1.131
+++ netinet6/nd6.c      28 Apr 2009 13:06:02 -0000
@@ -808,7 +808,7 @@ nd6_lookup(const struct in6_addr *addr6,
                 * interface route.
                 */
                if (create) {
-                       RTFREE(rt);
+                       RTFREE(&rt);
                        rt = NULL;
                }
        }
@@ -1971,7 +1971,7 @@ nd6_output(struct ifnet *ifp, struct ifn
                        if (rt->rt_gwroute == NULL)
                                goto lookup;
                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
-                               rtfree(rt); rt = rt0;
+                               rtfree(&rt); rt = rt0;
                        lookup:
                                rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1);
                                if ((rt = rt->rt_gwroute) == NULL)
Index: netinet6/nd6_nbr.c
===================================================================
RCS file: /cvsroot/src/sys/netinet6/nd6_nbr.c,v
retrieving revision 1.94
diff -u -p -r1.94 nd6_nbr.c
--- netinet6/nd6_nbr.c  18 Apr 2009 14:58:05 -0000      1.94
+++ netinet6/nd6_nbr.c  28 Apr 2009 13:06:02 -0000
@@ -244,7 +244,7 @@ nd6_ns_input(struct mbuf *m, int off, in
                        }
                }
                if (rt)
-                       rtfree(rt);
+                       rtfree(&rt);
        }
        if (ifa == NULL) {
                /*
Index: netinet6/nd6_rtr.c
===================================================================
RCS file: /cvsroot/src/sys/netinet6/nd6_rtr.c,v
retrieving revision 1.78
diff -u -p -r1.78 nd6_rtr.c
--- netinet6/nd6_rtr.c  18 Mar 2009 16:00:23 -0000      1.78
+++ netinet6/nd6_rtr.c  28 Apr 2009 13:06:02 -0000
@@ -559,7 +559,7 @@ defrouter_delreq(struct nd_defrouter *dr
                         * rtrequest().
                         */
                        oldrt->rt_refcnt++;
-                       rtfree(oldrt);
+                       rtfree(&oldrt);
                }
        }
 
@@ -1694,7 +1694,7 @@ nd6_prefix_offlink(struct nd_prefix *pr)
                if (rt->rt_refcnt <= 0) {
                        /* XXX: we should free the entry ourselves. */
                        rt->rt_refcnt++;
-                       rtfree(rt);
+                       rtfree(&rt);
                }
        }
 


Home | Main Index | Thread Index | Old Index