All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] usb: core: Unregister device on component_add() failure
@ 2022-02-08 17:00 Fabio M. De Francesco
  2022-02-09 14:00 ` Heikki Krogerus
  0 siblings, 1 reply; 3+ messages in thread
From: Fabio M. De Francesco @ 2022-02-08 17:00 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Heikki Krogerus, Rafael J. Wysocki,
	Andy Shevchenko, linux-usb, linux-kernel
  Cc: Fabio M. De Francesco, syzbot+60df062e1c41940cae0f

Commit 8c67d06f3fd9 ("usb: Link the ports to the connectors they are
attached to") creates a link to the USB Type-C connector for every new
port that is added when possible. If component_add() fails,
usb_hub_create_port_device() prints a warning but does not unregister
the device and does not return errors to the callers.

Syzbot reported a "WARNING in component_del()".

Fix this issue in usb_hub_create_port_device by calling device_unregister()
and returning the errors from component_add().

Reported-by: syzbot+60df062e1c41940cae0f@syzkaller.appspotmail.com
Fixes: 8c67d06f3fd9 ("usb: Link the ports to the connectors they are attached to")
Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
---
 drivers/usb/core/port.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
index c2bbf97a79be..8455b235976a 100644
--- a/drivers/usb/core/port.c
+++ b/drivers/usb/core/port.c
@@ -605,8 +605,11 @@ int usb_hub_create_port_device(struct usb_hub *hub, int port1)
 	find_and_link_peer(hub, port1);
 
 	retval = component_add(&port_dev->dev, &connector_ops);
-	if (retval)
+	if (retval) {
 		dev_warn(&port_dev->dev, "failed to add component\n");
+		device_unregister(&port_dev->dev);
+		return retval;
+	}
 
 	/*
 	 * Enable runtime pm and hold a refernce that hub_configure()
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] usb: core: Unregister device on component_add() failure
  2022-02-08 17:00 [PATCH] usb: core: Unregister device on component_add() failure Fabio M. De Francesco
@ 2022-02-09 14:00 ` Heikki Krogerus
  2022-02-09 16:30   ` Fabio M. De Francesco
  0 siblings, 1 reply; 3+ messages in thread
From: Heikki Krogerus @ 2022-02-09 14:00 UTC (permalink / raw)
  To: Fabio M. De Francesco
  Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Andy Shevchenko,
	linux-usb, linux-kernel, syzbot+60df062e1c41940cae0f

On Tue, Feb 08, 2022 at 06:00:48PM +0100, Fabio M. De Francesco wrote:
> Commit 8c67d06f3fd9 ("usb: Link the ports to the connectors they are
> attached to") creates a link to the USB Type-C connector for every new
> port that is added when possible. If component_add() fails,
> usb_hub_create_port_device() prints a warning but does not unregister
> the device and does not return errors to the callers.
> 
> Syzbot reported a "WARNING in component_del()".
> 
> Fix this issue in usb_hub_create_port_device by calling device_unregister()
> and returning the errors from component_add().
> 
> Reported-by: syzbot+60df062e1c41940cae0f@syzkaller.appspotmail.com
> Fixes: 8c67d06f3fd9 ("usb: Link the ports to the connectors they are attached to")
> Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
> ---
>  drivers/usb/core/port.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
> index c2bbf97a79be..8455b235976a 100644
> --- a/drivers/usb/core/port.c
> +++ b/drivers/usb/core/port.c
> @@ -605,8 +605,11 @@ int usb_hub_create_port_device(struct usb_hub *hub, int port1)
>  	find_and_link_peer(hub, port1);
>  
>  	retval = component_add(&port_dev->dev, &connector_ops);
> -	if (retval)
> +	if (retval) {
>  		dev_warn(&port_dev->dev, "failed to add component\n");
> +		device_unregister(&port_dev->dev);
> +		return retval;

You didn't remove the peer links. Either remove them here separately,
or alternatively you can also just shuffle the code so that you only
create those links after the component_add() call:

diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
index c2bbf97a79bec..d5bc36ca5b1f7 100644
--- a/drivers/usb/core/port.c
+++ b/drivers/usb/core/port.c
@@ -602,11 +602,14 @@ int usb_hub_create_port_device(struct usb_hub *hub, int port1)
                return retval;
        }
 
-       find_and_link_peer(hub, port1);
-
        retval = component_add(&port_dev->dev, &connector_ops);
-       if (retval)
+       if (retval) {
                dev_warn(&port_dev->dev, "failed to add component\n");
+               device_unregister(&port_dev->dev);
+               return retval;
+       }
+
+       find_and_link_peer(hub, port1);
 
        /*
         * Enable runtime pm and hold a refernce that hub_configure()

thanks,

-- 
heikki

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] usb: core: Unregister device on component_add() failure
  2022-02-09 14:00 ` Heikki Krogerus
@ 2022-02-09 16:30   ` Fabio M. De Francesco
  0 siblings, 0 replies; 3+ messages in thread
From: Fabio M. De Francesco @ 2022-02-09 16:30 UTC (permalink / raw)
  To: Heikki Krogerus
  Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Andy Shevchenko,
	linux-usb, linux-kernel, syzbot+60df062e1c41940cae0f

On mercoled? 9 febbraio 2022 15:00:09 CET Heikki Krogerus wrote:
> On Tue, Feb 08, 2022 at 06:00:48PM +0100, Fabio M. De Francesco wrote:
> > Commit 8c67d06f3fd9 ("usb: Link the ports to the connectors they are
> > attached to") creates a link to the USB Type-C connector for every new
> > port that is added when possible. If component_add() fails,
> > usb_hub_create_port_device() prints a warning but does not unregister
> > the device and does not return errors to the callers.
> > 
> > Syzbot reported a "WARNING in component_del()".
> > 
> > Fix this issue in usb_hub_create_port_device by calling device_unregister()
> > and returning the errors from component_add().
> > 
> > Reported-by: syzbot+60df062e1c41940cae0f@syzkaller.appspotmail.com
> > Fixes: 8c67d06f3fd9 ("usb: Link the ports to the connectors they are attached to")
> > Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
> > ---
> >  drivers/usb/core/port.c | 5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > [...]
> >
> You didn't remove the peer links. Either remove them here separately,
> or alternatively you can also just shuffle the code so that you only
> create those links after the component_add() call:
>
> [...]
> 

Hello Heikki,

Thanks for your review and suggestion. I think that I'll use the second of the
two possible solutions (shuffle the code).

I had to spend some time to understand the code of usb_hub_create_port_device(),
component_add() and component_del(). Unfortunately, the USB core is very far from
the usual things I look at or care of. Therefore I missed that find_and_link_peer()
does some work that must be either unwound or simply postponed. I agree with you 
that the latter is the best solution.

I need some minutes to submit v2.

Again, thanks,

Fabio

> thanks,
> 
> -- 
> heikki
> 





^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-02-09 16:30 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-08 17:00 [PATCH] usb: core: Unregister device on component_add() failure Fabio M. De Francesco
2022-02-09 14:00 ` Heikki Krogerus
2022-02-09 16:30   ` Fabio M. De Francesco

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.