From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jacob Keller Subject: [PATCH 2/4] ethtool: ensure channel counts are within bounds during SCHANNELS Date: Mon, 8 Feb 2016 12:06:03 -0800 Message-ID: <1454961965-15116-3-git-send-email-jacob.e.keller@intel.com> References: <1454961965-15116-1-git-send-email-jacob.e.keller@intel.com> Cc: mooray3@wp.pl, davem@davemloft.net, Jacob Keller To: netdev@vger.kernel.org Return-path: Received: from mga14.intel.com ([192.55.52.115]:8053 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753152AbcBHUIk (ORCPT ); Mon, 8 Feb 2016 15:08:40 -0500 In-Reply-To: <1454961965-15116-1-git-send-email-jacob.e.keller@intel.com> Sender: netdev-owner@vger.kernel.org List-ID: 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 --- net/core/ethtool.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 8a40948c1fc6..71aff99157c3 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c @@ -1276,16 +1276,27 @@ 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 = 0; int ret; - 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; + ret = dev->ethtool_ops->get_channels(dev, &max); + if (ret) + return ret; + + /* 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) && -- 2.7.0.236.gda096a0.dirty