Skip to content

Commit

Permalink
USB: open disconnect race in iowarrior
Browse files Browse the repository at this point in the history
the driver sets intfdata to NULL without lock. Data structures can be
freed and accessed.

Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Oliver Neukum authored and Greg Kroah-Hartman committed Oct 25, 2007
1 parent 5919a43 commit 03f36e8
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion drivers/usb/misc/iowarrior.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ module_param(debug, bool, 0644);
MODULE_PARM_DESC(debug, "debug=1 enables debugging messages");

static struct usb_driver iowarrior_driver;
static DEFINE_MUTEX(iowarrior_open_disc_lock);

/*--------------*/
/* data */
Expand Down Expand Up @@ -608,11 +609,15 @@ static int iowarrior_open(struct inode *inode, struct file *file)
return -ENODEV;
}

mutex_lock(&iowarrior_open_disc_lock);
dev = usb_get_intfdata(interface);
if (!dev)
if (!dev) {
mutex_unlock(&iowarrior_open_disc_lock);
return -ENODEV;
}

mutex_lock(&dev->mutex);
mutex_unlock(&iowarrior_open_disc_lock);

/* Only one process can open each device, no sharing. */
if (dev->opened) {
Expand Down Expand Up @@ -866,6 +871,7 @@ static void iowarrior_disconnect(struct usb_interface *interface)
int minor;

dev = usb_get_intfdata(interface);
mutex_lock(&iowarrior_open_disc_lock);
usb_set_intfdata(interface, NULL);

minor = dev->minor;
Expand All @@ -879,6 +885,7 @@ static void iowarrior_disconnect(struct usb_interface *interface)
dev->present = 0;

mutex_unlock(&dev->mutex);
mutex_unlock(&iowarrior_open_disc_lock);

if (dev->opened) {
/* There is a process that holds a filedescriptor to the device ,
Expand Down

0 comments on commit 03f36e8

Please sign in to comment.