phonet: use siocdevprivate
authorArnd Bergmann <arnd@arndb.de>
Tue, 27 Jul 2021 13:44:52 +0000 (15:44 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Jul 2021 19:11:43 +0000 (20:11 +0100)
phonet has a single private ioctl that is broken in compat
mode on big-endian machines today because the data returned
from it is never copied back to user space.

Move it over to the ndo_siocdevprivate callback, which also
fixes the compat issue.

Cc: Remi Denis-Courmont <courmisch@gmail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: RĂ©mi Denis-Courmont <courmisch@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/cdc-phonet.c
net/phonet/pn_dev.c

index 8d1f69dad6031f9f9b1d9ff40f9e84daa2dc5ef3..e1da9102a540dda48c578a20357c69c7e008258c 100644 (file)
@@ -253,7 +253,8 @@ static int usbpn_close(struct net_device *dev)
        return usb_set_interface(pnd->usb, num, !pnd->active_setting);
 }
 
-static int usbpn_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+static int usbpn_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                               void __user *data, int cmd)
 {
        struct if_phonet_req *req = (struct if_phonet_req *)ifr;
 
@@ -269,7 +270,7 @@ static const struct net_device_ops usbpn_ops = {
        .ndo_open       = usbpn_open,
        .ndo_stop       = usbpn_close,
        .ndo_start_xmit = usbpn_xmit,
-       .ndo_do_ioctl   = usbpn_ioctl,
+       .ndo_siocdevprivate = usbpn_siocdevprivate,
 };
 
 static void usbpn_setup(struct net_device *dev)
index ac0fae06cc153f405eccf72a30b3b500ff9c3b21..876d0ae5f9fdc4a4293753610addaeaf45ce3781 100644 (file)
@@ -233,11 +233,11 @@ static int phonet_device_autoconf(struct net_device *dev)
        struct if_phonet_req req;
        int ret;
 
-       if (!dev->netdev_ops->ndo_do_ioctl)
+       if (!dev->netdev_ops->ndo_siocdevprivate)
                return -EOPNOTSUPP;
 
-       ret = dev->netdev_ops->ndo_do_ioctl(dev, (struct ifreq *)&req,
-                                               SIOCPNGAUTOCONF);
+       ret = dev->netdev_ops->ndo_siocdevprivate(dev, (struct ifreq *)&req,
+                                                 NULL, SIOCPNGAUTOCONF);
        if (ret < 0)
                return ret;