Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753185AbdDCOTj (ORCPT ); Mon, 3 Apr 2017 10:19:39 -0400 Received: from iolanthe.rowland.org ([192.131.102.54]:44208 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1753213AbdDCOTg (ORCPT ); Mon, 3 Apr 2017 10:19:36 -0400 Date: Mon, 3 Apr 2017 10:19:35 -0400 (EDT) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: Roger Quadros cc: balbi@kernel.org, , , Subject: Re: [PATCH v3 1/3] usb: udc: allow adding and removing the same gadget device In-Reply-To: <1491222031-18120-2-git-send-email-rogerq@ti.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1501 Lines: 38 On Mon, 3 Apr 2017, Roger Quadros wrote: > allow usb_del_gadget_udc() and usb add_gadget_udc() to be called > repeatedly on the same gadget->dev structure. > > We need to clear the gadget->dev structure so that kobject_init() > doesn't complain about already initialized object. > > Signed-off-by: Roger Quadros > --- > drivers/usb/gadget/udc/core.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c > index d685d82..efce68e 100644 > --- a/drivers/usb/gadget/udc/core.c > +++ b/drivers/usb/gadget/udc/core.c > @@ -1273,6 +1273,7 @@ void usb_del_gadget_udc(struct usb_gadget *gadget) > flush_work(&gadget->work); > device_unregister(&udc->dev); > device_unregister(&gadget->dev); > + memset(&gadget->dev, 0x00, sizeof(gadget->dev)); > } > EXPORT_SYMBOL_GPL(usb_del_gadget_udc); Isn't this dangerous? It's quite possible that the device_unregister() call on the previous line invokes the gadget->dev.release callback, which might deallocate gadget. If that happens, your new memset will oops. In general, if an object relies on reference counting for its lifetime, you cannot register and unregister it more than once. A typical issue is that some code retains a reference to the old instance and tries to use it after the new instance has been registered, thereby messing up the new instance. I don't know if that is possible in this case, but it is something to watch out for. Alan Stern