| From 2339536d229df25c71c0900fc619289229bfecf6 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Thu, 12 Oct 2017 10:54:21 +0200 |
| Subject: USB: serial: metro-usb: stop I/O after failed open |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit 2339536d229df25c71c0900fc619289229bfecf6 upstream. |
| |
| Make sure to kill the interrupt-in URB after a failed open request. |
| Apart from saving power (and avoiding stale input after a later |
| successful open), this also prevents a NULL-deref in the completion |
| handler if the port is manually unbound. |
| |
| Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Fixes: 704577861d5e ("USB: serial: metro-usb: get data from device in Uni-Directional mode.") |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/serial/metro-usb.c | 11 ++++++++--- |
| 1 file changed, 8 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/usb/serial/metro-usb.c |
| +++ b/drivers/usb/serial/metro-usb.c |
| @@ -189,7 +189,7 @@ static int metrousb_open(struct tty_stru |
| dev_err(&port->dev, |
| "%s - failed submitting interrupt in urb, error code=%d\n", |
| __func__, result); |
| - goto exit; |
| + return result; |
| } |
| |
| /* Send activate cmd to device */ |
| @@ -198,9 +198,14 @@ static int metrousb_open(struct tty_stru |
| dev_err(&port->dev, |
| "%s - failed to configure device, error code=%d\n", |
| __func__, result); |
| - goto exit; |
| + goto err_kill_urb; |
| } |
| -exit: |
| + |
| + return 0; |
| + |
| +err_kill_urb: |
| + usb_kill_urb(port->interrupt_in_urb); |
| + |
| return result; |
| } |
| |