]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/usb/misc/iowarrior.c
USB: iowarrior: fix use-after-free on disconnect
[mirror_ubuntu-bionic-kernel.git] / drivers / usb / misc / iowarrior.c
index b3eb485fa96767a44fd84e96b2d2790c8829ba37..7012222eadc8ab86bc934fc496904658d44db0fe 100644 (file)
@@ -871,8 +871,6 @@ static void iowarrior_disconnect(struct usb_interface *interface)
        dev = usb_get_intfdata(interface);
        mutex_lock(&iowarrior_open_disc_lock);
        usb_set_intfdata(interface, NULL);
-       /* prevent device read, write and ioctl */
-       dev->present = 0;
 
        minor = dev->minor;
        mutex_unlock(&iowarrior_open_disc_lock);
@@ -883,8 +881,7 @@ static void iowarrior_disconnect(struct usb_interface *interface)
        mutex_lock(&dev->mutex);
 
        /* prevent device read, write and ioctl */
-
-       mutex_unlock(&dev->mutex);
+       dev->present = 0;
 
        if (dev->opened) {
                /* There is a process that holds a filedescriptor to the device ,
@@ -894,8 +891,10 @@ static void iowarrior_disconnect(struct usb_interface *interface)
                usb_kill_urb(dev->int_in_urb);
                wake_up_interruptible(&dev->read_wait);
                wake_up_interruptible(&dev->write_wait);
+               mutex_unlock(&dev->mutex);
        } else {
                /* no process is using the device, cleanup now */
+               mutex_unlock(&dev->mutex);
                iowarrior_delete(dev);
        }