On Wed, Oct 11, 2017 at 10:44:22AM +0200, Martin Pieuchot wrote:
> Moar cleanup to be able to selectively take the NET_LOCK() around some
> ioctls.
> 
> This diff change many "return (error)" into "break".

It looks a bit inconsistent, where you replace the return and where
not.  But I am sure your next diff will resolve this.

> It adds error checks for SIOC{A,D}IFGROUP.  The only driver handling
> these ioctl(2)s is... carp(4)!

This (error == ENOTTY) is strange.  I hides something in the kernel
where the user land requests impossible things and cannot cope with
an error.  But as we do not want to break things, I think this
approach makes sense.

> ok?

OK bluhm@

> Index: net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.514
> diff -u -p -r1.514 if.c
> --- net/if.c  11 Oct 2017 07:57:27 -0000      1.514
> +++ net/if.c  11 Oct 2017 08:37:31 -0000
> @@ -1817,7 +1817,7 @@ ifioctl(struct socket *so, u_long cmd, c
>  {
>       struct ifnet *ifp;
>       struct ifreq *ifr = (struct ifreq *)data;
> -     struct ifgroupreq *ifgr;
> +     struct ifgroupreq *ifgr = (struct ifgroupreq *)data;
>       struct if_afreq *ifar = (struct if_afreq *)data;
>       char ifdescrbuf[IFDESCRSIZE];
>       char ifrtlabelbuf[RTLABEL_LEN];
> @@ -1858,7 +1858,7 @@ ifioctl(struct socket *so, u_long cmd, c
>       case SIOCIFAFATTACH:
>       case SIOCIFAFDETACH:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> +                     break;
>               switch (ifar->ifar_af) {
>               case AF_INET:
>                       /* attach is a noop for AF_INET */
> @@ -1874,7 +1874,7 @@ ifioctl(struct socket *so, u_long cmd, c
>                       break;
>  #endif /* INET6 */
>               default:
> -                     return (EAFNOSUPPORT);
> +                     error = EAFNOSUPPORT;
>               }
>               break;
>  
> @@ -1909,7 +1909,7 @@ ifioctl(struct socket *so, u_long cmd, c
>  
>       case SIOCSIFFLAGS:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> +                     break;
>  
>               ifp->if_flags = (ifp->if_flags & IFF_CANTCHANGE) |
>                       (ifr->ifr_flags & ~IFF_CANTCHANGE);
> @@ -1934,13 +1934,13 @@ ifioctl(struct socket *so, u_long cmd, c
>  
>       case SIOCSIFXFLAGS:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> +                     break;
>  
>  #ifdef INET6
>               if (ISSET(ifr->ifr_flags, IFXF_AUTOCONF6)) {
>                       error = in6_ifattach(ifp);
>                       if (error != 0)
> -                             return (error);
> +                             break;
>               }
>  #endif       /* INET6 */
>  
> @@ -1972,7 +1972,7 @@ ifioctl(struct socket *so, u_long cmd, c
>                               error = ifp->if_wol(ifp, 1);
>                               splx(s);
>                               if (error)
> -                                     return (error);
> +                                     break;
>                       }
>                       if (ISSET(ifp->if_xflags, IFXF_WOL) &&
>                           !ISSET(ifr->ifr_flags, IFXF_WOL)) {
> @@ -1981,7 +1981,7 @@ ifioctl(struct socket *so, u_long cmd, c
>                               error = ifp->if_wol(ifp, 0);
>                               splx(s);
>                               if (error)
> -                                     return (error);
> +                                     break;
>                       }
>               } else if (ISSET(ifr->ifr_flags, IFXF_WOL)) {
>                       ifr->ifr_flags &= ~IFXF_WOL;
> @@ -1995,13 +1995,13 @@ ifioctl(struct socket *so, u_long cmd, c
>  
>       case SIOCSIFMETRIC:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> +                     break;
>               ifp->if_metric = ifr->ifr_metric;
>               break;
>  
>       case SIOCSIFMTU:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> +                     break;
>               if (ifp->if_ioctl == NULL)
>                       return (EOPNOTSUPP);
>               error = (*ifp->if_ioctl)(ifp, cmd, data);
> @@ -2049,7 +2049,7 @@ ifioctl(struct socket *so, u_long cmd, c
>  
>       case SIOCSIFDESCR:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> +                     break;
>               error = copyinstr(ifr->ifr_data, ifdescrbuf,
>                   IFDESCRSIZE, &bytesdone);
>               if (error == 0) {
> @@ -2070,7 +2070,7 @@ ifioctl(struct socket *so, u_long cmd, c
>  
>       case SIOCSIFRTLABEL:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> +                     break;
>               error = copyinstr(ifr->ifr_data, ifrtlabelbuf,
>                   RTLABEL_LEN, &bytesdone);
>               if (error == 0) {
> @@ -2085,7 +2085,7 @@ ifioctl(struct socket *so, u_long cmd, c
>  
>       case SIOCSIFPRIORITY:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> +                     break;
>               if (ifr->ifr_metric < 0 || ifr->ifr_metric > 15)
>                       return (EINVAL);
>               ifp->if_priority = ifr->ifr_metric;
> @@ -2097,32 +2097,32 @@ ifioctl(struct socket *so, u_long cmd, c
>  
>       case SIOCSIFRDOMAIN:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> -             if ((error = if_setrdomain(ifp, ifr->ifr_rdomainid)) != 0)
> -                     return (error);
> +                     break;
> +             error = if_setrdomain(ifp, ifr->ifr_rdomainid);
>               break;
>  
>       case SIOCAIFGROUP:
>               if ((error = suser(p, 0)))
> -                     return (error);
> -             ifgr = (struct ifgroupreq *)data;
> +                     break;
>               if ((error = if_addgroup(ifp, ifgr->ifgr_group)))
> -                     return (error);
> -             (*ifp->if_ioctl)(ifp, cmd, data); /* XXX error check */
> +                     break;
> +             error = (*ifp->if_ioctl)(ifp, cmd, data);
> +             if (error == ENOTTY)
> +                     error = 0;
>               break;
>  
>       case SIOCGIFGROUP:
> -             if ((error = if_getgroup(data, ifp)))
> -                     return (error);
> +             error = if_getgroup(data, ifp);
>               break;
>  
>       case SIOCDIFGROUP:
>               if ((error = suser(p, 0)))
> -                     return (error);
> -             (*ifp->if_ioctl)(ifp, cmd, data); /* XXX error check */
> -             ifgr = (struct ifgroupreq *)data;
> -             if ((error = if_delgroup(ifp, ifgr->ifgr_group)))
> -                     return (error);
> +                     break;
> +             error = (*ifp->if_ioctl)(ifp, cmd, data);
> +             if (error == ENOTTY)
> +                     error = 0;
> +             if (error == 0)
> +                     error = if_delgroup(ifp, ifgr->ifgr_group);
>               break;
>  
>       case SIOCSIFLLADDR:
> @@ -2157,7 +2157,7 @@ ifioctl(struct socket *so, u_long cmd, c
>  
>       case SIOCSIFLLPRIO:
>               if ((error = suser(p, 0)))
> -                     return (error);
> +                     break;
>               if (ifr->ifr_llprio > UCHAR_MAX)
>                       return (EINVAL);
>               ifp->if_llprio = ifr->ifr_llprio;

Reply via email to