summaryrefslogtreecommitdiff
path: root/net/core
diff options
context:
space:
mode:
authorYunsheng Lin <linyunsheng@huawei.com>2018-12-26 19:51:46 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-06-11 12:22:49 +0200
commitb9d3bd8e2897838af22c96d6c5f5bfc8261f5cd8 (patch)
tree5221cb7865931ce4e0cbfef4825aa3b356f74d95 /net/core
parent8474fc0335aeba513243f921988608e5d3108357 (diff)
ethtool: check the return value of get_regs_len
commit f9fc54d313fab2834f44f516459cdc8ac91d797f upstream. The return type for get_regs_len in struct ethtool_ops is int, the hns3 driver may return error when failing to get the regs len by sending cmd to firmware. Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net> Cc: Michal Kubecek <mkubecek@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/ethtool.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index bb5a12ac7152..ffe7b03c9ab5 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -878,8 +878,13 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
if (rc >= 0)
info.n_priv_flags = rc;
}
- if (ops->get_regs_len)
- info.regdump_len = ops->get_regs_len(dev);
+ if (ops->get_regs_len) {
+ int ret = ops->get_regs_len(dev);
+
+ if (ret > 0)
+ info.regdump_len = ret;
+ }
+
if (ops->get_eeprom_len)
info.eedump_len = ops->get_eeprom_len(dev);
@@ -1380,6 +1385,9 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
return -EFAULT;
reglen = ops->get_regs_len(dev);
+ if (reglen <= 0)
+ return reglen;
+
if (regs.len > reglen)
regs.len = reglen;