On Thu, Dec 03, 2015 at 02:52:59PM +0100, Vincent Gross wrote:
> bluhm@ spotted one case where in_broadcast was needed.
> 
> ok ?

OK bluhm@

> 
> Index: sys/net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.418
> diff -u -p -r1.418 if.c
> --- sys/net/if.c      3 Dec 2015 12:22:51 -0000       1.418
> +++ sys/net/if.c      3 Dec 2015 13:48:58 -0000
> @@ -1220,13 +1220,6 @@ ifa_ifwithaddr(struct sockaddr *addr, u_
>  
>                       if (equal(addr, ifa->ifa_addr))
>                               return (ifa);
> -
> -                     /* IPv6 doesn't have broadcast */
> -                     if ((ifp->if_flags & IFF_BROADCAST) &&
> -                         ifa->ifa_broadaddr &&
> -                         ifa->ifa_broadaddr->sa_len != 0 &&
> -                         equal(ifa->ifa_broadaddr, addr))
> -                             return (ifa);
>               }
>       }
>       return (NULL);
> Index: sys/net/route.c
> ===================================================================
> RCS file: /cvs/src/sys/net/route.c,v
> retrieving revision 1.283
> diff -u -p -r1.283 route.c
> --- sys/net/route.c   2 Dec 2015 16:49:58 -0000       1.283
> +++ sys/net/route.c   3 Dec 2015 13:49:00 -0000
> @@ -539,7 +539,9 @@ rtredirect(struct sockaddr *dst, struct 
>        bcmp((caddr_t)(a1), (caddr_t)(a2), (a1)->sa_len) == 0)
>       if (rt != NULL && (!equal(src, rt->rt_gateway) || rt->rt_ifa != ifa))
>               error = EINVAL;
> -     else if (ifa_ifwithaddr(gateway, rdomain) != NULL)
> +     else if (ifa_ifwithaddr(gateway, rdomain) != NULL ||
> +         (gateway->sa_family = AF_INET &&
> +         in_broadcast(satosin(gateway)->sin_addr, rdomain)))
>               error = EHOSTUNREACH;
>       if (error)
>               goto done;
> Index: sys/netinet/in_pcb.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in_pcb.c,v
> retrieving revision 1.191
> diff -u -p -r1.191 in_pcb.c
> --- sys/netinet/in_pcb.c      3 Dec 2015 09:49:15 -0000       1.191
> +++ sys/netinet/in_pcb.c      3 Dec 2015 13:49:00 -0000
> @@ -332,14 +332,13 @@ in_pcbbind(struct inpcb *inp, struct mbu
>  
>                               ia = ifatoia(ifa_ifwithaddr(sintosa(sin),
>                                   inp->inp_rtableid));
> -                             if (ia == NULL)
> -                                     return (EADDRNOTAVAIL);
>  
>                               /* SOCK_RAW does not use in_pcbbind() */
> -                             if (so->so_type != SOCK_DGRAM &&
> -                                 sin->sin_addr.s_addr !=
> -                                 ia->ia_addr.sin_addr.s_addr)
> -                                     return (EADDRNOTAVAIL);
> +                             if (ia == NULL &&
> +                                 (so->so_type != SOCK_DGRAM ||
> +                                 !in_broadcast(sin->sin_addr,
> +                                     inp->inp_rtableid)))
> +                                             return (EADDRNOTAVAIL);
>                       }
>               }
>               if (lport) {
> @@ -353,7 +352,8 @@ in_pcbbind(struct inpcb *inp, struct mbu
>                               t = in_pcblookup(table, &zeroin_addr, 0,
>                                   &sin->sin_addr, lport, INPLOOKUP_WILDCARD,
>                                   inp->inp_rtableid);
> -                             if (t && (so->so_euid != 
> t->inp_socket->so_euid))
> +                             if (t &&
> +                                 (so->so_euid != t->inp_socket->so_euid))
>                                       return (EADDRINUSE);
>                       }
>                       t = in_pcblookup(table, &zeroin_addr, 0,
> Index: sys/netinet/ip_output.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_output.c,v
> retrieving revision 1.311
> diff -u -p -r1.311 ip_output.c
> --- sys/netinet/ip_output.c   2 Dec 2015 20:50:20 -0000       1.311
> +++ sys/netinet/ip_output.c   3 Dec 2015 13:49:01 -0000
> @@ -1368,13 +1368,12 @@ ip_setmoptions(int optname, struct ip_mo
>               sin.sin_family = AF_INET;
>               sin.sin_addr = addr;
>               ia = ifatoia(ifa_ifwithaddr(sintosa(&sin), rtableid));
> -             if (ia && in_hosteq(sin.sin_addr, ia->ia_addr.sin_addr))
> -                     ifp = ia->ia_ifp;
> -             if (ifp == NULL || (ifp->if_flags & IFF_MULTICAST) == 0) {
> +             if (ia == NULL ||
> +                 (ia->ia_ifp->if_flags & IFF_MULTICAST) == 0) {
>                       error = EADDRNOTAVAIL;
>                       break;
>               }
> -             imo->imo_ifidx = ifp->if_index;
> +             imo->imo_ifidx = ia->ia_ifp->if_index;
>               break;
>  
>       case IP_MULTICAST_TTL:
> @@ -1542,12 +1541,11 @@ ip_setmoptions(int optname, struct ip_mo
>                       sin.sin_family = AF_INET;
>                       sin.sin_addr = mreq->imr_interface;
>                       ia = ifatoia(ifa_ifwithaddr(sintosa(&sin), rtableid));
> -                     if (ia && in_hosteq(sin.sin_addr, ia->ia_addr.sin_addr))
> -                             ifp = ia->ia_ifp;
> -                     else {
> +                     if (ia == NULL) {
>                               error = EADDRNOTAVAIL;
>                               break;
>                       }
> +                     ifp = ia->ia_ifp;
>               }
>               /*
>                * Find the membership in the membership array.
> Index: sys/netinet/raw_ip.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/raw_ip.c,v
> retrieving revision 1.84
> diff -u -p -r1.84 raw_ip.c
> --- sys/netinet/raw_ip.c      28 Jul 2015 12:22:07 -0000      1.84
> +++ sys/netinet/raw_ip.c      3 Dec 2015 13:49:01 -0000
> @@ -473,6 +473,7 @@ rip_usrreq(struct socket *so, int req, s
>               if (!((so->so_options & SO_BINDANY) ||
>                   addr->sin_addr.s_addr == INADDR_ANY ||
>                   addr->sin_addr.s_addr == INADDR_BROADCAST ||
> +                 in_broadcast(addr->sin_addr, inp->inp_rtableid) ||
>                   ifa_ifwithaddr(sintosa(addr), inp->inp_rtableid))) {
>                       error = EADDRNOTAVAIL;
>                       break;

Reply via email to