| From f9fc54d313fab2834f44f516459cdc8ac91d797f Mon Sep 17 00:00:00 2001 |
| From: Yunsheng Lin <linyunsheng@huawei.com> |
| Date: Wed, 26 Dec 2018 19:51:46 +0800 |
| Subject: ethtool: check the return value of get_regs_len |
| |
| From: Yunsheng Lin <linyunsheng@huawei.com> |
| |
| 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> |
| |
| --- |
| net/core/ethtool.c | 12 ++++++++++-- |
| 1 file changed, 10 insertions(+), 2 deletions(-) |
| |
| --- a/net/core/ethtool.c |
| +++ b/net/core/ethtool.c |
| @@ -428,8 +428,13 @@ static noinline_for_stack int ethtool_ge |
| 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); |
| |
| @@ -883,6 +888,9 @@ static int ethtool_get_regs(struct net_d |
| return -EFAULT; |
| |
| reglen = ops->get_regs_len(dev); |
| + if (reglen <= 0) |
| + return reglen; |
| + |
| if (regs.len > reglen) |
| regs.len = reglen; |
| |