mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-15 09:55:36 +00:00
USB: usb_get_string should check the descriptor type
This patch (as1218) fixes a problem with a radio-control joystick used in the "walkera 4#3" helicopter. This device responds to the initial Get-String-Descriptor request for string 0 (which is really the list of supported languages) by sending its config descriptor! The usb_get_string() routine needs to check whether it got the right type of descriptor. Oddly enough, this sort of check is already present in usb_get_descriptor(). The patch changes the error code from -EPROTO to -ENODATA, because -EPROTO shows up in so many other contexts to indicate a hardware failure rather than a firmware error. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Tested-by: Guillermo Jarabo <williamjap@gmail.com> Cc: stable <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> ===================================================================
This commit is contained in:
parent
54b9ed35ae
commit
67f5a4ba97
@ -653,7 +653,7 @@ int usb_get_descriptor(struct usb_device *dev, unsigned char type,
|
|||||||
if (result <= 0 && result != -ETIMEDOUT)
|
if (result <= 0 && result != -ETIMEDOUT)
|
||||||
continue;
|
continue;
|
||||||
if (result > 1 && ((u8 *)buf)[1] != type) {
|
if (result > 1 && ((u8 *)buf)[1] != type) {
|
||||||
result = -EPROTO;
|
result = -ENODATA;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -696,8 +696,13 @@ static int usb_get_string(struct usb_device *dev, unsigned short langid,
|
|||||||
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
|
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
|
||||||
(USB_DT_STRING << 8) + index, langid, buf, size,
|
(USB_DT_STRING << 8) + index, langid, buf, size,
|
||||||
USB_CTRL_GET_TIMEOUT);
|
USB_CTRL_GET_TIMEOUT);
|
||||||
if (!(result == 0 || result == -EPIPE))
|
if (result == 0 || result == -EPIPE)
|
||||||
break;
|
continue;
|
||||||
|
if (result > 1 && ((u8 *) buf)[1] != USB_DT_STRING) {
|
||||||
|
result = -ENODATA;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user