Do not pass NULL to rtdeletemsg()

2015-12-07 Thread Martin Pieuchot
If the interface is gone that means you're dealing with a cached route
so there's no need to try to remove it from the table.

Better be explicit and do that before calling rtdeletemsg() rather than
inside.

ok?

Index: netinet/ip_icmp.c
===
RCS file: /cvs/src/sys/netinet/ip_icmp.c,v
retrieving revision 1.150
diff -u -p -r1.150 ip_icmp.c
--- netinet/ip_icmp.c   3 Dec 2015 21:11:53 -   1.150
+++ netinet/ip_icmp.c   7 Dec 2015 12:40:06 -
@@ -1042,19 +1042,21 @@ icmp_mtudisc(struct icmp *icp, u_int rta
 void
 icmp_mtudisc_timeout(struct rtentry *rt, struct rttimer *r)
 {
-   if (rt == NULL)
-   panic("icmp_mtudisc_timeout:  bad route to timeout");
+   struct ifnet *ifp;
+   int s;
 
-   if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
-   (RTF_DYNAMIC | RTF_HOST)) {
+   ifp = if_get(rt->rt_ifidx);
+   if (ifp == NULL)
+   return;
+
+   if ((rt->rt_flags & (RTF_DYNAMIC|RTF_HOST)) == (RTF_DYNAMIC|RTF_HOST)) {
void *(*ctlfunc)(int, struct sockaddr *, u_int, void *);
struct sockaddr_in sin;
-   int s;
 
sin = *satosin(rt_key(rt));
 
s = splsoftnet();
-   rtdeletemsg(rt, NULL, r->rtt_tableid);
+   rtdeletemsg(rt, ifp, r->rtt_tableid);
 
/* Notify TCP layer of increased Path MTU estimate */
ctlfunc = inetsw[ip_protox[IPPROTO_TCP]].pr_ctlinput;
@@ -1062,9 +1064,12 @@ icmp_mtudisc_timeout(struct rtentry *rt,
(*ctlfunc)(PRC_MTUINC, sintosa(),
r->rtt_tableid, NULL);
splx(s);
-   } else
+   } else {
if ((rt->rt_rmx.rmx_locks & RTV_MTU) == 0)
rt->rt_rmx.rmx_mtu = 0;
+   }
+
+   if_put(ifp);
 }
 
 /*
@@ -1088,17 +1093,20 @@ icmp_ratelimit(const struct in_addr *dst
 void
 icmp_redirect_timeout(struct rtentry *rt, struct rttimer *r)
 {
-   if (rt == NULL)
-   panic("icmp_redirect_timeout:  bad route to timeout");
+   struct ifnet *ifp;
+   int s;
 
-   if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
-   (RTF_DYNAMIC | RTF_HOST)) {
-   int s;
+   ifp = if_get(rt->rt_ifidx);
+   if (ifp == NULL)
+   return;
 
+   if ((rt->rt_flags & (RTF_DYNAMIC|RTF_HOST)) == (RTF_DYNAMIC|RTF_HOST)) {
s = splsoftnet();
-   rtdeletemsg(rt, NULL, r->rtt_tableid);
+   rtdeletemsg(rt, ifp, r->rtt_tableid);
splx(s);
}
+
+   if_put(ifp);
 }
 
 int
Index: netinet6/icmp6.c
===
RCS file: /cvs/src/sys/netinet6/icmp6.c,v
retrieving revision 1.182
diff -u -p -r1.182 icmp6.c
--- netinet6/icmp6.c3 Dec 2015 21:11:53 -   1.182
+++ netinet6/icmp6.c7 Dec 2015 12:39:28 -
@@ -1952,34 +1952,42 @@ icmp6_mtudisc_clone(struct sockaddr *dst
 void
 icmp6_mtudisc_timeout(struct rtentry *rt, struct rttimer *r)
 {
-   if (rt == NULL)
-   panic("icmp6_mtudisc_timeout: bad route to timeout");
-   if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
-   (RTF_DYNAMIC | RTF_HOST)) {
-   int s;
+   struct ifnet *ifp;
+   int s;
 
+   ifp = if_get(rt->rt_ifidx);
+   if (ifp == NULL)
+   return;
+
+   if ((rt->rt_flags & (RTF_DYNAMIC|RTF_HOST)) == (RTF_DYNAMIC|RTF_HOST)) {
s = splsoftnet();
-   rtdeletemsg(rt, NULL, r->rtt_tableid);
+   rtdeletemsg(rt, ifp, r->rtt_tableid);
splx(s);
} else {
if (!(rt->rt_rmx.rmx_locks & RTV_MTU))
rt->rt_rmx.rmx_mtu = 0;
}
+
+   if_put(ifp);
 }
 
 void
 icmp6_redirect_timeout(struct rtentry *rt, struct rttimer *r)
 {
-   if (rt == NULL)
-   panic("icmp6_redirect_timeout: bad route to timeout");
-   if ((rt->rt_flags & (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) ==
-   (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) {
-   int s;
+   struct ifnet *ifp;
+   int s;
 
+   ifp = if_get(rt->rt_ifidx);
+   if (ifp == NULL)
+   return;
+
+   if ((rt->rt_flags & (RTF_DYNAMIC|RTF_HOST)) == (RTF_DYNAMIC|RTF_HOST)) {
s = splsoftnet();
-   rtdeletemsg(rt, NULL, r->rtt_tableid);
+   rtdeletemsg(rt, ifp, r->rtt_tableid);
splx(s);
}
+
+   if_put(ifp);
 }
 
 int *icmpv6ctl_vars[ICMPV6CTL_MAXID] = ICMPV6CTL_VARS;



Re: Do not pass NULL to rtdeletemsg()

2015-12-07 Thread Vincent Gross
On 12/07/15 14:57, Martin Pieuchot wrote:
> If the interface is gone that means you're dealing with a cached route
> so there's no need to try to remove it from the table.
> 
> Better be explicit and do that before calling rtdeletemsg() rather than
> inside.
> 
> ok?

ok vgross@

> 
> Index: netinet/ip_icmp.c
> ===
> RCS file: /cvs/src/sys/netinet/ip_icmp.c,v
> retrieving revision 1.150
> diff -u -p -r1.150 ip_icmp.c
> --- netinet/ip_icmp.c 3 Dec 2015 21:11:53 -   1.150
> +++ netinet/ip_icmp.c 7 Dec 2015 12:40:06 -
> @@ -1042,19 +1042,21 @@ icmp_mtudisc(struct icmp *icp, u_int rta
>  void
>  icmp_mtudisc_timeout(struct rtentry *rt, struct rttimer *r)
>  {
> - if (rt == NULL)
> - panic("icmp_mtudisc_timeout:  bad route to timeout");
> + struct ifnet *ifp;
> + int s;
>  
> - if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
> - (RTF_DYNAMIC | RTF_HOST)) {
> + ifp = if_get(rt->rt_ifidx);
> + if (ifp == NULL)
> + return;
> +
> + if ((rt->rt_flags & (RTF_DYNAMIC|RTF_HOST)) == (RTF_DYNAMIC|RTF_HOST)) {
>   void *(*ctlfunc)(int, struct sockaddr *, u_int, void *);
>   struct sockaddr_in sin;
> - int s;
>  
>   sin = *satosin(rt_key(rt));
>  
>   s = splsoftnet();
> - rtdeletemsg(rt, NULL, r->rtt_tableid);
> + rtdeletemsg(rt, ifp, r->rtt_tableid);
>  
>   /* Notify TCP layer of increased Path MTU estimate */
>   ctlfunc = inetsw[ip_protox[IPPROTO_TCP]].pr_ctlinput;
> @@ -1062,9 +1064,12 @@ icmp_mtudisc_timeout(struct rtentry *rt,
>   (*ctlfunc)(PRC_MTUINC, sintosa(),
>   r->rtt_tableid, NULL);
>   splx(s);
> - } else
> + } else {
>   if ((rt->rt_rmx.rmx_locks & RTV_MTU) == 0)
>   rt->rt_rmx.rmx_mtu = 0;
> + }
> +
> + if_put(ifp);
>  }
>  
>  /*
> @@ -1088,17 +1093,20 @@ icmp_ratelimit(const struct in_addr *dst
>  void
>  icmp_redirect_timeout(struct rtentry *rt, struct rttimer *r)
>  {
> - if (rt == NULL)
> - panic("icmp_redirect_timeout:  bad route to timeout");
> + struct ifnet *ifp;
> + int s;
>  
> - if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
> - (RTF_DYNAMIC | RTF_HOST)) {
> - int s;
> + ifp = if_get(rt->rt_ifidx);
> + if (ifp == NULL)
> + return;
>  
> + if ((rt->rt_flags & (RTF_DYNAMIC|RTF_HOST)) == (RTF_DYNAMIC|RTF_HOST)) {
>   s = splsoftnet();
> - rtdeletemsg(rt, NULL, r->rtt_tableid);
> + rtdeletemsg(rt, ifp, r->rtt_tableid);
>   splx(s);
>   }
> +
> + if_put(ifp);
>  }
>  
>  int
> Index: netinet6/icmp6.c
> ===
> RCS file: /cvs/src/sys/netinet6/icmp6.c,v
> retrieving revision 1.182
> diff -u -p -r1.182 icmp6.c
> --- netinet6/icmp6.c  3 Dec 2015 21:11:53 -   1.182
> +++ netinet6/icmp6.c  7 Dec 2015 12:39:28 -
> @@ -1952,34 +1952,42 @@ icmp6_mtudisc_clone(struct sockaddr *dst
>  void
>  icmp6_mtudisc_timeout(struct rtentry *rt, struct rttimer *r)
>  {
> - if (rt == NULL)
> - panic("icmp6_mtudisc_timeout: bad route to timeout");
> - if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
> - (RTF_DYNAMIC | RTF_HOST)) {
> - int s;
> + struct ifnet *ifp;
> + int s;
>  
> + ifp = if_get(rt->rt_ifidx);
> + if (ifp == NULL)
> + return;
> +
> + if ((rt->rt_flags & (RTF_DYNAMIC|RTF_HOST)) == (RTF_DYNAMIC|RTF_HOST)) {
>   s = splsoftnet();
> - rtdeletemsg(rt, NULL, r->rtt_tableid);
> + rtdeletemsg(rt, ifp, r->rtt_tableid);
>   splx(s);
>   } else {
>   if (!(rt->rt_rmx.rmx_locks & RTV_MTU))
>   rt->rt_rmx.rmx_mtu = 0;
>   }
> +
> + if_put(ifp);
>  }
>  
>  void
>  icmp6_redirect_timeout(struct rtentry *rt, struct rttimer *r)
>  {
> - if (rt == NULL)
> - panic("icmp6_redirect_timeout: bad route to timeout");
> - if ((rt->rt_flags & (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) ==
> - (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) {
> - int s;
> + struct ifnet *ifp;
> + int s;
>  
> + ifp = if_get(rt->rt_ifidx);
> + if (ifp == NULL)
> + return;
> +
> + if ((rt->rt_flags & (RTF_DYNAMIC|RTF_HOST)) == (RTF_DYNAMIC|RTF_HOST)) {
>   s = splsoftnet();
> - rtdeletemsg(rt, NULL, r->rtt_tableid);
> + rtdeletemsg(rt, ifp, r->rtt_tableid);
>   splx(s);
>   }
> +
> + if_put(ifp);
>  }
>  
>  int *icmpv6ctl_vars[ICMPV6CTL_MAXID] = ICMPV6CTL_VARS;
>