ethtool: ensure channel counts are within bounds during SCHANNELS
authorKeller, Jacob E <jacob.e.keller@intel.com>
Tue, 9 Feb 2016 00:05:04 +0000 (16:05 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 16 Feb 2016 20:19:49 +0000 (15:19 -0500)
Add a sanity check to ensure that all requested channel sizes are within
bounds, which should reduce errors in driver implementation.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/ethtool.c

index 379bdc59b1c8ac042b05732347d001df00854b18..65f907aea7770e2e9d7ea1c82ffd6f616e424e63 100644 (file)
@@ -1274,15 +1274,24 @@ static noinline_for_stack int ethtool_get_channels(struct net_device *dev,
 static noinline_for_stack int ethtool_set_channels(struct net_device *dev,
                                                   void __user *useraddr)
 {
-       struct ethtool_channels channels;
+       struct ethtool_channels channels, max;
        u32 max_rx_in_use = 0;
 
-       if (!dev->ethtool_ops->set_channels)
+       if (!dev->ethtool_ops->set_channels || !dev->ethtool_ops->get_channels)
                return -EOPNOTSUPP;
 
        if (copy_from_user(&channels, useraddr, sizeof(channels)))
                return -EFAULT;
 
+       dev->ethtool_ops->get_channels(dev, &max);
+
+       /* ensure new counts are within the maximums */
+       if ((channels.rx_count > max.max_rx) ||
+           (channels.tx_count > max.max_tx) ||
+           (channels.combined_count > max.max_combined) ||
+           (channels.other_count > max.max_other))
+               return -EINVAL;
+
        /* ensure the new Rx count fits within the configured Rx flow
         * indirection table settings */
        if (netif_is_rxfh_configured(dev) &&