ethtool: don't open-code memdup_user()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 13 May 2017 22:31:26 +0000 (18:31 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 30 Jun 2017 06:04:10 +0000 (02:04 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
net/core/ethtool.c

index 03111a2d6653b8f06427540eb5864b255af4ead3..674b6c9cec18afae6f1b597a6e978d5a1fe6c7fe 100644 (file)
@@ -2322,16 +2322,12 @@ static int ethtool_set_tunable(struct net_device *dev, void __user *useraddr)
        ret = ethtool_tunable_valid(&tuna);
        if (ret)
                return ret;
-       data = kmalloc(tuna.len, GFP_USER);
-       if (!data)
-               return -ENOMEM;
        useraddr += sizeof(tuna);
-       ret = -EFAULT;
-       if (copy_from_user(data, useraddr, tuna.len))
-               goto out;
+       data = memdup_user(useraddr, tuna.len);
+       if (IS_ERR(data))
+               return PTR_ERR(data);
        ret = ops->set_tunable(dev, &tuna, data);
 
-out:
        kfree(data);
        return ret;
 }
@@ -2507,18 +2503,14 @@ static int set_phy_tunable(struct net_device *dev, void __user *useraddr)
        ret = ethtool_phy_tunable_valid(&tuna);
        if (ret)
                return ret;
-       data = kmalloc(tuna.len, GFP_USER);
-       if (!data)
-               return -ENOMEM;
        useraddr += sizeof(tuna);
-       ret = -EFAULT;
-       if (copy_from_user(data, useraddr, tuna.len))
-               goto out;
+       data = memdup_user(useraddr, tuna.len);
+       if (IS_ERR(data))
+               return PTR_ERR(data);
        mutex_lock(&phydev->lock);
        ret = phydev->drv->set_tunable(phydev, &tuna, data);
        mutex_unlock(&phydev->lock);
 
-out:
        kfree(data);
        return ret;
 }