NACK/Cmnt: [SRU][F][PATCH 1/2] net: asix: fix uninit value bugs

Koichiro Den koichiro.den at canonical.com
Mon Oct 28 06:41:00 UTC 2024


On Fri, Oct 25, 2024 at 03:49:53PM +0200, Manuel Diewald wrote:
> On Fri, Oct 25, 2024 at 10:27:14PM +0900, Koichiro Den wrote:
> > From: Pavel Skripkin <paskripkin at gmail.com>
> > 
> > Syzbot reported uninit-value in asix_mdio_read(). The problem was in
> > missing error handling. asix_read_cmd() should initialize passed stack
> > variable smsr, but it can fail in some cases. Then while condidition
> > checks possibly uninit smsr variable.
> > 
> > Since smsr is uninitialized stack variable, driver can misbehave,
> > because smsr will be random in case of asix_read_cmd() failure.
> > Fix it by adding error handling and just continue the loop instead of
> > checking uninit value.
> > 
> > Added helper function for checking Host_En bit, since wrong loop was used
> > in 4 functions and there is no need in copy-pasting code parts.
> > 
> > Cc: Robert Foss <robert.foss at collabora.com>
> > Fixes: d9fe64e51114 ("net: asix: Add in_pm parameter")
> > Reported-by: syzbot+a631ec9e717fb0423053 at syzkaller.appspotmail.com
> > Signed-off-by: Pavel Skripkin <paskripkin at gmail.com>
> > Signed-off-by: David S. Miller <davem at davemloft.net>
> > (backported from commit a786e3195d6af183033e86f0518ffd2c51c0e8ac)
> > [koichiroden: Adjusted context due to missing commit d275afb66371 ("net:
> > usb: asix: add error handling for asix_mdio_* functions"), which in turn
> > depends on e532a096be0e ("net: usb: asix: ax88772: add phylib support").
> > Ref. [PATCH net-next v2 0/8] port asix ax88772 to the PHYlib
> > https://lore.kernel.org/linux-usb/20210607082727.26045-1-o.rempel@pengutronix.de/]
> > CVE-2021-47101
> > Signed-off-by: Koichiro Den <koichiro.den at canonical.com>
> > ---
> >  drivers/net/usb/asix_common.c | 71 +++++++++++++++--------------------
> >  1 file changed, 31 insertions(+), 40 deletions(-)
> > 
> > diff --git a/drivers/net/usb/asix_common.c b/drivers/net/usb/asix_common.c
> > index 7bc6e8f856fe..12ce52600eaf 100644
> > --- a/drivers/net/usb/asix_common.c
> > +++ b/drivers/net/usb/asix_common.c
> > @@ -63,6 +63,29 @@ void asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index,
> >  			       value, index, data, size);
> >  }
> >  
> > +static int asix_check_host_enable(struct usbnet *dev, int in_pm)
> > +{
> > +	int i, ret;
> > +	u8 smsr;
> > +
> > +	for (i = 0; i < 30; ++i) {
> > +		ret = asix_set_sw_mii(dev, in_pm);
> > +		if (ret == -ENODEV || ret == -ETIMEDOUT)
> > +			break;
> > +		usleep_range(1000, 1100);
> > +		ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
> > +				    0, 0, 1, &smsr, in_pm);
> > +		if (ret == -ENODEV)
> > +			break;
> > +		else if (ret < 0)
> > +			continue;
> > +		else if (smsr & AX_HOST_EN)
> > +			break;
> > +	}
> > +
> > +	return ret;
> 
> There is a follow-up fix available upstream that fixes the return value
> of this new function:
> 
> d1652b70d07c asix: fix wrong return value in asix_check_host_enable()
> 
> I think we should include it in this patchset.

Thank you for catching this. I'll send v2 soon.

> 
> -- 
>  Manuel





More information about the kernel-team mailing list