On Thu, Apr 7, 2022 at 10:40 AM Hangyu Hua <hbh25y@xxxxxxxxx> wrote: > > usb_put_dev shouldn't be called when uss720_probe succeeds because of > priv->usbdev. At the same time, priv->usbdev shouldn't be set to NULL > before destroy_priv in uss720_disconnect because usb_put_dev is in > destroy_priv. > > Fix this by moving priv->usbdev = NULL after usb_put_dev. Hi Hangyu, good catch as priv->usbdev is still used after the probe function. I agree with this patch. Reviewed-by: Dongliang Mu <mudongliangabcd@xxxxxxxxx> > > Fixes: dcb4b8ad6a44 ("misc/uss720: fix memory leak in uss720_probe") > Signed-off-by: Hangyu Hua <hbh25y@xxxxxxxxx> > --- > > v2: fix a stupid UAF in the previous version. > > drivers/usb/misc/uss720.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c > index 748139d26263..0be8efcda15d 100644 > --- a/drivers/usb/misc/uss720.c > +++ b/drivers/usb/misc/uss720.c > @@ -71,6 +71,7 @@ static void destroy_priv(struct kref *kref) > > dev_dbg(&priv->usbdev->dev, "destroying priv datastructure\n"); > usb_put_dev(priv->usbdev); > + priv->usbdev = NULL; > kfree(priv); > } > > @@ -736,7 +737,6 @@ static int uss720_probe(struct usb_interface *intf, > parport_announce_port(pp); > > usb_set_intfdata(intf, pp); > - usb_put_dev(usbdev); > return 0; > > probe_abort: > @@ -754,7 +754,6 @@ static void uss720_disconnect(struct usb_interface *intf) > usb_set_intfdata(intf, NULL); > if (pp) { > priv = pp->private_data; > - priv->usbdev = NULL; > priv->pp = NULL; > dev_dbg(&intf->dev, "parport_remove_port\n"); > parport_remove_port(pp); > -- > 2.25.1 >