kill dev_ifsioc()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 30 Sep 2017 23:31:15 +0000 (19:31 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 25 Jan 2018 00:13:45 +0000 (19:13 -0500)
Once upon a time net/socket.c:dev_ifsioc() used to handle SIOCSHWTSTAMP and
SIOCSIFMAP.  These have different native and compat layout, so the format
conversion had been needed.  In 2009 these two cases had been taken out,
turning the rest into a convoluted way to calling sock_do_ioctl().  We copy
compat structure into native one, call sock_do_ioctl() on that and copy
the result back for the in/out ioctls.  No layout transformation anywhere,
so we might as well just call sock_do_ioctl() and skip all the headache with
copying.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
net/socket.c

index 96e5b23a2a2e576d099448e2e41b7d4f47a90a3c..fd593a86fa76daa1d2f87be49fcaf4844a85148c 100644 (file)
@@ -2906,42 +2906,6 @@ static int compat_ifr_data_ioctl(struct net *net, unsigned int cmd,
        return dev_ioctl(net, cmd, u_ifreq64);
 }
 
        return dev_ioctl(net, cmd, u_ifreq64);
 }
 
-static int dev_ifsioc(struct net *net, struct socket *sock,
-                        unsigned int cmd, struct compat_ifreq __user *uifr32)
-{
-       struct ifreq __user *uifr;
-       int err;
-
-       uifr = compat_alloc_user_space(sizeof(*uifr));
-       if (copy_in_user(uifr, uifr32, sizeof(*uifr32)))
-               return -EFAULT;
-
-       err = sock_do_ioctl(net, sock, cmd, (unsigned long)uifr);
-
-       if (!err) {
-               switch (cmd) {
-               case SIOCGIFFLAGS:
-               case SIOCGIFMETRIC:
-               case SIOCGIFMTU:
-               case SIOCGIFMEM:
-               case SIOCGIFHWADDR:
-               case SIOCGIFINDEX:
-               case SIOCGIFADDR:
-               case SIOCGIFBRDADDR:
-               case SIOCGIFDSTADDR:
-               case SIOCGIFNETMASK:
-               case SIOCGIFPFLAGS:
-               case SIOCGIFTXQLEN:
-               case SIOCGMIIPHY:
-               case SIOCGMIIREG:
-                       if (copy_in_user(uifr32, uifr, sizeof(*uifr32)))
-                               err = -EFAULT;
-                       break;
-               }
-       }
-       return err;
-}
-
 static int compat_sioc_ifmap(struct net *net, unsigned int cmd,
                        struct compat_ifreq __user *uifr32)
 {
 static int compat_sioc_ifmap(struct net *net, unsigned int cmd,
                        struct compat_ifreq __user *uifr32)
 {
@@ -3172,8 +3136,6 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
        case SIOCGMIIPHY:
        case SIOCGMIIREG:
        case SIOCSMIIREG:
        case SIOCGMIIPHY:
        case SIOCGMIIREG:
        case SIOCSMIIREG:
-               return dev_ifsioc(net, sock, cmd, argp);
-
        case SIOCSARP:
        case SIOCGARP:
        case SIOCDARP:
        case SIOCSARP:
        case SIOCGARP:
        case SIOCDARP: