ethtool: fec: sanitize ethtool_fecparam->reserved
authorJakub Kicinski <kuba@kernel.org>
Thu, 25 Mar 2021 01:11:57 +0000 (18:11 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 25 Mar 2021 23:46:53 +0000 (16:46 -0700)
struct ethtool_fecparam::reserved is never looked at by the core.
Make sure it's actually 0. Unfortunately we can't return an error
because old ethtool doesn't zero-initialize the structure for SET.
On GET we can be more verbose, there are no in tree (ab)users.

Fix up the kdoc on the structure. Remove the mention of FEC
bypass. Seems like a niche thing to configure in the first
place.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/ethtool.h
net/ethtool/ioctl.c

index 36bf435d232c6c3b1d7d011cae6cbc24203ae6e5..9e2682a674600ed3c160dbb7b18c71fd5fd2ad1b 100644 (file)
@@ -1380,7 +1380,7 @@ struct ethtool_per_queue_op {
  * @cmd: Command number = %ETHTOOL_GFECPARAM or %ETHTOOL_SFECPARAM
  * @active_fec: FEC mode which is active on the port
  * @fec: Bitmask of supported/configured FEC modes
- * @rsvd: Reserved for future extensions. i.e FEC bypass feature.
+ * @reserved: Reserved for future extensions, ignore on GET, write 0 for SET.
  */
 struct ethtool_fecparam {
        __u32   cmd;
index 0788cc3b3114f8c8d04e8eae90f3f2f67106f0ef..be3549023d892ca02540526aa0f452d87880a432 100644 (file)
@@ -2568,6 +2568,9 @@ static int ethtool_get_fecparam(struct net_device *dev, void __user *useraddr)
        if (rc)
                return rc;
 
+       if (WARN_ON_ONCE(fecparam.reserved))
+               fecparam.reserved = 0;
+
        if (copy_to_user(useraddr, &fecparam, sizeof(fecparam)))
                return -EFAULT;
        return 0;
@@ -2583,6 +2586,8 @@ static int ethtool_set_fecparam(struct net_device *dev, void __user *useraddr)
        if (copy_from_user(&fecparam, useraddr, sizeof(fecparam)))
                return -EFAULT;
 
+       fecparam.reserved = 0;
+
        return dev->ethtool_ops->set_fecparam(dev, &fecparam);
 }