Commit 8bf36862 authored by Keller, Jacob E's avatar Keller, Jacob E Committed by David S. Miller

ethtool: ensure channel counts are within bounds during SCHANNELS

Add a sanity check to ensure that all requested channel sizes are within
bounds, which should reduce errors in driver implementation.
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d4ab4286
...@@ -1274,15 +1274,24 @@ static noinline_for_stack int ethtool_get_channels(struct net_device *dev, ...@@ -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, static noinline_for_stack int ethtool_set_channels(struct net_device *dev,
void __user *useraddr) void __user *useraddr)
{ {
struct ethtool_channels channels; struct ethtool_channels channels, max;
u32 max_rx_in_use = 0; 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; return -EOPNOTSUPP;
if (copy_from_user(&channels, useraddr, sizeof(channels))) if (copy_from_user(&channels, useraddr, sizeof(channels)))
return -EFAULT; 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 /* ensure the new Rx count fits within the configured Rx flow
* indirection table settings */ * indirection table settings */
if (netif_is_rxfh_configured(dev) && if (netif_is_rxfh_configured(dev) &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment