From: Jakub Kicinski <kuba@kernel.org>
To: Daniil Tatianin <d-tatianin@yandex-team.ru>
Cc: "David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>,
Hao Chen <chenhao288@hisilicon.com>,
Guangbin Huang <huangguangbin2@huawei.com>,
Wolfram Sang <wsa+renesas@sang-engineering.com>,
Marco Bonelli <marco@mebeim.net>, Tom Rix <trix@redhat.com>,
Tonghao Zhang <xiangxia.m.yue@gmail.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
lvc-project@linuxtesting.org, yc-core@yandex-team.ru
Subject: Re: [PATCH v1] net/ethtool/ioctl: ensure that we have phy ops before using them
Date: Mon, 14 Nov 2022 21:07:05 -0800 [thread overview]
Message-ID: <20221114210705.216996a9@kernel.org> (raw)
In-Reply-To: <20221114081532.3475625-1-d-tatianin@yandex-team.ru>
On Mon, 14 Nov 2022 11:15:32 +0300 Daniil Tatianin wrote:
> + if (!(phydev && phy_ops && phy_ops->get_stats) &&
> + !ops->get_ethtool_phy_stats)
This condition is still complicated.
> + return -EOPNOTSUPP;
The only way this crash can happen is if driver incorrectly returns
non-zero stats count but doesn't have a callback to read the stats.
So WARN_ON() would be in order here.
> if (!phydev && (!ops->get_ethtool_phy_stats || !ops->get_sset_count))
> return -EOPNOTSUPP;
>
> @@ -2063,13 +2066,12 @@ static int ethtool_get_phy_stats(struct net_device *dev, void __user *useraddr)
> if (!data)
> return -ENOMEM;
>
> - if (dev->phydev && !ops->get_ethtool_phy_stats &&
> - phy_ops && phy_ops->get_stats) {
> - ret = phy_ops->get_stats(dev->phydev, &stats, data);
> + if (ops->get_ethtool_phy_stats) {
> + ops->get_ethtool_phy_stats(dev, &stats, data);
> + } else {
> + ret = phy_ops->get_stats(phydev, &stats, data);
> if (ret < 0)
> goto out;
> - } else {
> - ops->get_ethtool_phy_stats(dev, &stats, data);
> }
We can also clean up the pointless indentation of this code while at it.
How about something along these lines (completely untested, please
review, test and make your own):
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 99272a67525c..ee04c388f4c9 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -2105,23 +2105,28 @@ static int ethtool_get_phy_stats(struct net_device *dev, void __user *useraddr)
stats.n_stats = n_stats;
- if (n_stats) {
- data = vzalloc(array_size(n_stats, sizeof(u64)));
- if (!data)
- return -ENOMEM;
+ if (!n_stats) {
+ data = NULL;
+ goto copy_back;
+ }
- if (phydev && !ops->get_ethtool_phy_stats &&
- phy_ops && phy_ops->get_stats) {
- ret = phy_ops->get_stats(phydev, &stats, data);
- if (ret < 0)
- goto out;
- } else {
- ops->get_ethtool_phy_stats(dev, &stats, data);
- }
+ data = vzalloc(array_size(n_stats, sizeof(u64)));
+ if (!data)
+ return -ENOMEM;
+
+ if (ops->get_ethtool_phy_stats) {
+ ops->get_ethtool_phy_stats(dev, &stats, data);
+ } else if (phydev && phy_ops && phy_ops->get_stats) {
+ ret = phy_ops->get_stats(phydev, &stats, data);
+ if (ret < 0)
+ goto out;
} else {
- data = NULL;
+ WARN_ON_ONCE(1);
+ n_stats = 0;
+ stats.n_stats = 0;
}
+copy_back:
ret = -EFAULT;
if (copy_to_user(useraddr, &stats, sizeof(stats)))
goto out;
next parent reply other threads:[~2022-11-15 5:07 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20221114081532.3475625-1-d-tatianin@yandex-team.ru>
2022-11-15 5:07 ` Jakub Kicinski [this message]
2022-11-15 15:40 ` [PATCH v1] net/ethtool/ioctl: ensure that we have phy ops before using them Andrew Lunn
2022-11-16 22:55 ` Saeed Mahameed
[not found] ` <d220e5b6-70d8-e64f-0544-d3dfaf905a6d@yandex-team.ru>
2022-11-17 12:59 ` Andrew Lunn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221114210705.216996a9@kernel.org \
--to=kuba@kernel.org \
--cc=chenhao288@hisilicon.com \
--cc=d-tatianin@yandex-team.ru \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=huangguangbin2@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lvc-project@linuxtesting.org \
--cc=marco@mebeim.net \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=trix@redhat.com \
--cc=wsa+renesas@sang-engineering.com \
--cc=xiangxia.m.yue@gmail.com \
--cc=yc-core@yandex-team.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.