Hi,

I was about to write a usb driver (port my old one) based on the
usb-skeleton.c example in the 2.6.0-test11 source. I either found a bug
or overlooked something...

The problem occurs in the following scenario: some usb-device is plugged
in, two clients open the corresponding file, the device gets unplugged,
one client releases its file handle, thereby executing the following
code:

        --dev->open; // dev->open is set to 1 now
        
        if (!dev->present) { // this is the case
                up (&dev->sem);
                skel_delete (dev); // so our dev struct gets deleted
                return 0;
        }

Now when the second client releases its file handle, it executes:

        dev = (struct usb_skel *)file->private_data;

which finds the old pointer to memory already freed in skel_delete. This
could become ugly, right?

As far as I can see, this might be fixed by replacing the line (in
skel_release)

        if (!dev->present) {

with something like

        if (!dev->present && !dev->open) {
.

regards,
Axel.

(I am not on linux-usb-devel so please reply to my address as well,
thanks.)



-------------------------------------------------------
This SF.net email is sponsored by: IBM Linux Tutorials.
Become an expert in LINUX or just sharpen your skills.  Sign up for IBM's
Free Linux Tutorials.  Learn everything from the bash shell to sys admin.
Click now! http://ads.osdn.com/?ad_id=1278&alloc_id=3371&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to