On 6/1/05, Alan Stern <[EMAIL PROTECTED]> wrote:
> On Wed, 1 Jun 2005, Dmitry Torokhov wrote:
> 
> > > +static ssize_t show_tabletSize(struct device *dev, char *buf)
> > > +{
> > > +       struct usb_acecad *acecad = dev_get_drvdata(dev);
> > > +
> > > +       if (acecad == NULL)
> > > +               return 0;
> >
> > This check - is it really needed? Attributes are deleted in
> > disconnect... Wait, this needs locking because if someone happens to
> > read one of the attributes while usb_acecad_disconnect is running you
> > may end up accessing just freed memory, no?
> 
> No.
> 
> Attributes are complex things.  When an attribute is opened the sysfs code
> does kobject_get on the underlying object.  The release method won't get
> called, and hence the memory won't get freed, until the attribute is
> closed.
> 
> On the other hand, remove methods typically do call dev_set_drvdata(dev,
> NULL).  Thus a read-during-disconnect might very well end up with acecad
> == NULL, and so the check above is necessary.
> 

OK, consider this:

CPU1:                                CPU2

if (acecad == NULL) // fails
                                                usb_set_intfdata(intf, NULL);
                                                ...
                                                kfree(acecad);

sprintf(... acecad->blah) -> oops

Unprotected check does not help and might as well be removed, with
proper locking in place it is not needed either.

-- 
Dmitry


-------------------------------------------------------
This SF.Net email is sponsored by Yahoo.
Introducing Yahoo! Search Developer Network - Create apps using Yahoo!
Search APIs Find out how you can build Yahoo! directly into your own
Applications - visit http://developer.yahoo.net/?fr=offad-ysdn-ostg-q22005
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to