On 30/03/16(Wed) 22:44, Vincent Gross wrote:
> Hello,
> 
> This diff moves the "are we binding to a privileged port while not being root 
> ?"
> check from in(6)_pcbaddrisavail() to in_pcbbind().
> 
> This way we have a cleaner separation between "is the resource available ?"
> and "am I allowed to access the resource ?" (which may or may not get its own
> function later).
> 
> Also, it unbreaks naddy@'s iked setup (ikev2:sendmsg([::]:500) =>
> in6_selectsrc() != in6p->inp_laddr6 => in6_pcbaddrisavail() => EPERM).
> 
> Ok ?

If you remove the KAME comment and your name, yes.

> Index: sys/netinet/in_pcb.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in_pcb.c,v
> retrieving revision 1.198
> diff -u -p -r1.198 in_pcb.c
> --- sys/netinet/in_pcb.c      26 Mar 2016 21:56:04 -0000      1.198
> +++ sys/netinet/in_pcb.c      30 Mar 2016 20:33:00 -0000
> @@ -341,9 +341,14 @@ in_pcbbind(struct inpcb *inp, struct mbu
>               }
>       }
>  
> -     if (lport == 0)
> +     if (lport == 0) {
>               if ((error = in_pcbpickport(&lport, wild, inp, p)))
>                       return (error);
> +     } else {
> +             if (ntohs(lport) < IPPORT_RESERVED &&
> +                 (error = suser(p, 0)))
> +                     return (EACCES);
> +     }
>       inp->inp_lport = lport;
>       in_pcbrehash(inp);
>       return (0);
> @@ -357,7 +362,6 @@ in_pcbaddrisavail(struct inpcb *inp, str
>       struct inpcbtable *table = inp->inp_table;
>       u_int16_t lport = sin->sin_port;
>       int reuseport = (so->so_options & SO_REUSEPORT);
> -     int error;
>  
>       if (IN_MULTICAST(sin->sin_addr.s_addr)) {
>               /*
> @@ -398,9 +402,6 @@ in_pcbaddrisavail(struct inpcb *inp, str
>               struct inpcb *t;
>  
>               /* GROSS */
> -             if (ntohs(lport) < IPPORT_RESERVED &&
> -                 (error = suser(p, 0)))
> -                     return (EACCES);
>               if (so->so_euid) {
>                       t = in_pcblookup(table, &zeroin_addr, 0,
>                           &sin->sin_addr, lport, INPLOOKUP_WILDCARD,
> Index: sys/netinet6/in6_pcb.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/in6_pcb.c,v
> retrieving revision 1.90
> diff -u -p -r1.90 in6_pcb.c
> --- sys/netinet6/in6_pcb.c    30 Mar 2016 13:02:22 -0000      1.90
> +++ sys/netinet6/in6_pcb.c    30 Mar 2016 20:33:01 -0000
> @@ -158,7 +158,6 @@ in6_pcbaddrisavail(struct inpcb *inp, st
>       struct inpcbtable *table = inp->inp_table;
>       u_short lport = sin6->sin6_port;
>       int reuseport = (so->so_options & SO_REUSEPORT);
> -     int error;
>  
>       wild |= INPLOOKUP_IPV6;
>       /* KAME hack: embed scopeid */
> @@ -226,8 +225,6 @@ in6_pcbaddrisavail(struct inpcb *inp, st
>                * finding a process for a socket instead of using
>                * curproc?  (Marked with BSD's {in,}famous XXX ?
>                */
> -             if (ntohs(lport) < IPPORT_RESERVED && (error = suser(p, 0)))
> -                     return error;
>               if (so->so_euid) {
>                       t = in_pcblookup(table,
>                           (struct in_addr *)&zeroin6_addr, 0,
> 

Reply via email to