The first rt_ifp of the day, make use of if_get() inside icmp_mtudisc().

ok?

Index: netinet/ip_icmp.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_icmp.c,v
retrieving revision 1.145
diff -u -p -r1.145 ip_icmp.c
--- netinet/ip_icmp.c   30 Oct 2015 09:39:42 -0000      1.145
+++ netinet/ip_icmp.c   19 Nov 2015 11:34:21 -0000
@@ -981,12 +981,17 @@ void
 icmp_mtudisc(struct icmp *icp, u_int rtableid)
 {
        struct rtentry *rt;
+       struct ifnet *ifp;
        u_long mtu = ntohs(icp->icmp_nextmtu);  /* Why a long?  IPv6 */
 
        rt = icmp_mtudisc_clone(icp->icmp_ip.ip_dst, rtableid);
        if (rt == NULL)
                return;
 
+       ifp = if_get(rt->rt_ifidx);
+       if (ifp == NULL)
+               return;
+
        if (mtu == 0) {
                int i = 0;
 
@@ -1002,7 +1007,7 @@ icmp_mtudisc(struct icmp *icp, u_int rta
                        /* If no route mtu, default to the interface mtu */
 
                        if (mtu == 0)
-                               mtu = rt->rt_ifp->if_mtu;
+                               mtu = ifp->if_mtu;
                }
 
                for (i = 0; i < nitems(mtu_table); i++)
@@ -1019,15 +1024,14 @@ icmp_mtudisc(struct icmp *icp, u_int rta
         *        on a route.  We should be using a separate flag
         *        for the kernel to indicate this.
         */
-
        if ((rt->rt_rmx.rmx_locks & RTV_MTU) == 0) {
-               if (mtu < 296 || mtu > rt->rt_ifp->if_mtu)
+               if (mtu < 296 || mtu > ifp->if_mtu)
                        rt->rt_rmx.rmx_locks |= RTV_MTU;
-               else if (rt->rt_rmx.rmx_mtu > mtu ||
-                   rt->rt_rmx.rmx_mtu == 0)
+               else if (rt->rt_rmx.rmx_mtu > mtu || rt->rt_rmx.rmx_mtu == 0)
                        rt->rt_rmx.rmx_mtu = mtu;
        }
 
+       if_put(ifp);
        rtfree(rt);
 }
 

Reply via email to