| From 8c34cb8ddfe808d557b51da983ff10c02793beb2 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Thu, 12 Jan 2017 14:56:20 +0100 |
| Subject: USB: serial: quatech2: fix control-message error handling |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit 8c34cb8ddfe808d557b51da983ff10c02793beb2 upstream. |
| |
| Make sure to detect short control-message transfers when fetching |
| modem and line state in open and when retrieving registers. |
| |
| This specifically makes sure that an errno is returned to user space on |
| errors in TIOCMGET instead of a zero bitmask. |
| |
| Also drop the unused getdevice function which also lacked appropriate |
| error handling. |
| |
| Fixes: f7a33e608d9a ("USB: serial: add quatech2 usb to serial driver") |
| Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/serial/quatech2.c | 24 +++++++++++++----------- |
| 1 file changed, 13 insertions(+), 11 deletions(-) |
| |
| --- a/drivers/usb/serial/quatech2.c |
| +++ b/drivers/usb/serial/quatech2.c |
| @@ -188,22 +188,22 @@ static inline int qt2_setdevice(struct u |
| } |
| |
| |
| -static inline int qt2_getdevice(struct usb_device *dev, u8 *data) |
| -{ |
| - return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), |
| - QT_SET_GET_DEVICE, 0xc0, 0, 0, |
| - data, 3, QT2_USB_TIMEOUT); |
| -} |
| - |
| static inline int qt2_getregister(struct usb_device *dev, |
| u8 uart, |
| u8 reg, |
| u8 *data) |
| { |
| - return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), |
| - QT_SET_GET_REGISTER, 0xc0, reg, |
| - uart, data, sizeof(*data), QT2_USB_TIMEOUT); |
| + int ret; |
| |
| + ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), |
| + QT_SET_GET_REGISTER, 0xc0, reg, |
| + uart, data, sizeof(*data), QT2_USB_TIMEOUT); |
| + if (ret < sizeof(*data)) { |
| + if (ret >= 0) |
| + ret = -EIO; |
| + } |
| + |
| + return ret; |
| } |
| |
| static inline int qt2_setregister(struct usb_device *dev, |
| @@ -372,9 +372,11 @@ static int qt2_open(struct tty_struct *t |
| 0xc0, 0, |
| device_port, data, 2, QT2_USB_TIMEOUT); |
| |
| - if (status < 0) { |
| + if (status < 2) { |
| dev_err(&port->dev, "%s - open port failed %i\n", __func__, |
| status); |
| + if (status >= 0) |
| + status = -EIO; |
| kfree(data); |
| return status; |
| } |