lkml.org 
[lkml]   [2022]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
SubjectRe: [PATCH] net: ax88179: add proper error handling of usb read errors
From
Hi David,

On 5/14/22 16:32, David Kahurani wrote:
> Reads that are lesser than the requested size lead to uninit-value bugs.
> In this particular case a variable which was supposed to be initialized
> after a read is left uninitialized after a partial read.
>
> Qualify such reads as errors and handle them correctly and while at it
> convert the reader functions to return zero on success for easier error
> handling.
>
> Fixes: e2ca90c276e1 ("ax88179_178a: ASIX AX88179_178A USB 3.0/2.0 to gigabit ethernet adapter driver")
> Signed-off-by: David Kahurani <k.kahurani@gmail.com>
> Reported-and-tested-by: syzbot+d3dbdf31fbe9d8f5f311@syzkaller.appspotmail.com
> ---

<--- here (*)

> drivers/net/usb/ax88179_178a.c | 281 ++++++++++++++++++++++++++-------
> 1 file changed, 227 insertions(+), 54 deletions(-)
>

I don't see any error in that patch, but I had to find previous versions
of that patch in my inbox.

Usually new versions of single patches are linked in one thread and have
a version number in a title. You can generate patch with version using
-v option of git format-patch like:

$ git format-patch -v2 HEAD~

And you can send new version as reply using --in-reply= option of git
send-email. It helps a lot with finding previous version, since all
version are linked in one thread

And all updates from version to version should be put under --- (*),
since it's hard to remember why previous version was rejected.


> jtimeout = jiffies + delay;
> do {
> - ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_SROM_CMD,
> - 1, 1, &buf);
> + ret = ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_SROM_CMD,
> + 1, 1, &buf);
> + if (ret) {
> + netdev_dbg(dev->net,
> + "Failed to read SROM_CMD: %d\n",
> + ret);
> + return ret;
> + }
>
> if (time_after(jiffies, jtimeout))
> return -EINVAL;
>
> } while (buf & EEP_BUSY);

I think, this change might be dangerous. Maybe it should be done in the
same way as in asix driver [1]. Code polls for some register after a
write and maybe non-fatal read error might occur here.

Just my thoughts, I don't know anything about that device :)


> + ret = ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_NODE_ID, ETH_ALEN,
> + ETH_ALEN, mac);
> +
> + if (ret)
> + netdev_dbg(dev->net, "Failed to read NODE_ID: %d", ret);
> + else
> + netif_dbg(dev, ifup, dev->net,
> + "MAC address read from ASIX chip");

Maybe also use `netif_dbg` here?... There should be a reason why it was
used here in the first place. Or should not :)

Anyway, if someone will say that bailing out from while loop on any
error is OK feel free to add

Reviewed-by: Pavel Skripkin <paskripkin@gmail.com>



[1]
https://elixir.bootlin.com/linux/latest/source/drivers/net/usb/asix_common.c#L78


With regards,
Pavel Skripkin
[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2022-05-14 18:53    [W:0.057 / U:1.188 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site