On Mon, Oct 16, 2017 at 12:13:09PM +0200, Martin Pieuchot wrote:
> All interfaces define an `if_ioctl' function pointer.  So do not check
> for it.
> 
> Change the remaining 'return' into 'break'.
> 
> In SIOCSIFLLADDR change the address *after* querying the driver.  This
> make the logic in vlan(4) work as intended.
> 
> ok?

OK bluhm@

> Index: net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.517
> diff -u -p -r1.517 if.c
> --- net/if.c  16 Oct 2017 08:19:15 -0000      1.517
> +++ net/if.c  16 Oct 2017 10:09:37 -0000
> @@ -556,6 +556,8 @@ if_attach_queues(struct ifnet *ifp, unsi
>  void
>  if_attach_common(struct ifnet *ifp)
>  {
> +     KASSERT(ifp->if_ioctl != NULL);
> +
>       TAILQ_INIT(&ifp->if_addrlist);
>       TAILQ_INIT(&ifp->if_maddrlist);
>  
> @@ -1524,11 +1526,8 @@ if_downall(void)
>               if ((ifp->if_flags & IFF_UP) == 0)
>                       continue;
>               if_down(ifp);
> -             if (ifp->if_ioctl) {
> -                     ifrq.ifr_flags = ifp->if_flags;
> -                     (void) (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS,
> -                         (caddr_t)&ifrq);
> -             }
> +             ifrq.ifr_flags = ifp->if_flags;
> +             (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifrq);
>       }
>       NET_UNLOCK();
>  }
> @@ -1913,12 +1912,10 @@ ifioctl(struct socket *so, u_long cmd, c
>               ifp->if_flags = (ifp->if_flags & IFF_CANTCHANGE) |
>                       (ifr->ifr_flags & ~IFF_CANTCHANGE);
>  
> -             if (ifp->if_ioctl != NULL) {
> -                     error = (*ifp->if_ioctl)(ifp, cmd, data);
> -                     if (error != 0) {
> -                             ifp->if_flags = oif_flags;
> -                             break;
> -                     }
> +             error = (*ifp->if_ioctl)(ifp, cmd, data);
> +             if (error != 0) {
> +                     ifp->if_flags = oif_flags;
> +                     break;
>               }
>  
>               if (ISSET(oif_flags ^ ifp->if_flags, IFF_UP)) {
> @@ -2001,8 +1998,6 @@ ifioctl(struct socket *so, u_long cmd, c
>       case SIOCSIFMTU:
>               if ((error = suser(p, 0)) != 0)
>                       break;
> -             if (ifp->if_ioctl == NULL)
> -                     return (EOPNOTSUPP);
>               error = (*ifp->if_ioctl)(ifp, cmd, data);
>               if (!error)
>                       rtm_ifchg(ifp);
> @@ -2024,7 +2019,7 @@ ifioctl(struct socket *so, u_long cmd, c
>       case SIOCSIFPARENT:
>       case SIOCDIFPARENT:
>               if ((error = suser(p, 0)) != 0)
> -                     return (error);
> +                     break;
>               /* FALLTHROUGH */
>       case SIOCGIFPSRCADDR:
>       case SIOCGIFPDSTADDR:
> @@ -2035,8 +2030,6 @@ ifioctl(struct socket *so, u_long cmd, c
>       case SIOCGVNETID:
>       case SIOCGIFPAIR:
>       case SIOCGIFPARENT:
> -             if (ifp->if_ioctl == 0)
> -                     return (EOPNOTSUPP);
>               error = (*ifp->if_ioctl)(ifp, cmd, data);
>               break;
>  
> @@ -2085,8 +2078,10 @@ ifioctl(struct socket *so, u_long cmd, c
>       case SIOCSIFPRIORITY:
>               if ((error = suser(p, 0)) != 0)
>                       break;
> -             if (ifr->ifr_metric < 0 || ifr->ifr_metric > 15)
> -                     return (EINVAL);
> +             if (ifr->ifr_metric < 0 || ifr->ifr_metric > 15) {
> +                     error = EINVAL;
> +                     break;
> +             }
>               ifp->if_priority = ifr->ifr_metric;
>               break;
>  
> @@ -2126,28 +2121,31 @@ ifioctl(struct socket *so, u_long cmd, c
>  
>       case SIOCSIFLLADDR:
>               if ((error = suser(p, 0)))
> -                     return (error);
> -             if (ifp->if_sadl == NULL)
> -                     return (EINVAL);
> -             if (ifr->ifr_addr.sa_len != ETHER_ADDR_LEN)
> -                     return (EINVAL);
> -             if (ETHER_IS_MULTICAST(ifr->ifr_addr.sa_data))
> -                     return (EINVAL);
> +                     break;
> +             if ((ifp->if_sadl == NULL) ||
> +                 (ifr->ifr_addr.sa_len != ETHER_ADDR_LEN) ||
> +                 (ETHER_IS_MULTICAST(ifr->ifr_addr.sa_data))) {
> +                     error = EINVAL;
> +                     break;
> +             }
>               switch (ifp->if_type) {
>               case IFT_ETHER:
>               case IFT_CARP:
>               case IFT_XETHER:
>               case IFT_ISO88025:
> -                     if_setlladdr(ifp, ifr->ifr_addr.sa_data);
>                       error = (*ifp->if_ioctl)(ifp, cmd, data);
>                       if (error == ENOTTY)
>                               error = 0;
> +                     if (error == 0)
> +                             error = if_setlladdr(ifp,
> +                                 ifr->ifr_addr.sa_data);
>                       break;
>               default:
> -                     return (ENODEV);
> +                     error = ENODEV;
>               }
>  
> -             ifnewlladdr(ifp);
> +             if (error == 0)
> +                     ifnewlladdr(ifp);
>               break;
>  
>       case SIOCGIFLLPRIO:
> @@ -2157,8 +2155,10 @@ ifioctl(struct socket *so, u_long cmd, c
>       case SIOCSIFLLPRIO:
>               if ((error = suser(p, 0)))
>                       break;
> -             if (ifr->ifr_llprio > UCHAR_MAX)
> -                     return (EINVAL);
> +             if (ifr->ifr_llprio > UCHAR_MAX) {
> +                     error = EINVAL;
> +                     break;
> +             }
>               ifp->if_llprio = ifr->ifr_llprio;
>               break;
>  
> @@ -2539,9 +2539,8 @@ if_setgroupattribs(caddr_t data)
>       ifg->ifg_carp_demoted += demote;
>  
>       TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next)
> -             if (ifgm->ifgm_ifp->if_ioctl)
> -                     ifgm->ifgm_ifp->if_ioctl(ifgm->ifgm_ifp,
> -                         SIOCSIFGATTR, data);
> +             ifgm->ifgm_ifp->if_ioctl(ifgm->ifgm_ifp, SIOCSIFGATTR, data);
> +
>       return (0);
>  }
>  

Reply via email to