summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Hovold <jhovold@gmail.com>2013-03-19 09:21:09 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-03-28 12:12:27 -0700
commitcbff2b6d371dbbae19de1dcfd09051683eca02ca (patch)
tree376fa238a64110fd66e969ce6723fc9dcb9adb0f
parent10a00e38f3478eb899916f9a15d97e1b565106c3 (diff)
downloadlwn-cbff2b6d371dbbae19de1dcfd09051683eca02ca.tar.gz
lwn-cbff2b6d371dbbae19de1dcfd09051683eca02ca.zip
USB: serial: fix interface refcounting
commit d7971051e4df825e0bc11b995e87bfe86355b8e5 upstream. Make sure the interface is not released before our serial device. Note that drivers are still not allowed to access the interface in any way that may interfere with another driver that may have gotten bound to the same interface after disconnect returns. Signed-off-by: Johan Hovold <jhovold@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/serial/usb-serial.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index e4b199cbc97b..810695b3b4ef 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -168,6 +168,7 @@ static void destroy_serial(struct kref *kref)
}
}
+ usb_put_intf(serial->interface);
usb_put_dev(serial->dev);
kfree(serial);
}
@@ -625,7 +626,7 @@ static struct usb_serial *create_serial(struct usb_device *dev,
}
serial->dev = usb_get_dev(dev);
serial->type = driver;
- serial->interface = interface;
+ serial->interface = usb_get_intf(interface);
kref_init(&serial->kref);
mutex_init(&serial->disc_mutex);
serial->minor = SERIAL_TTY_NO_MINOR;