lkml.org 
[lkml]   [2009]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 22/96] USB: usb_get_string should check the descriptor type
    2.6.27-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Alan Stern <stern@rowland.harvard.edu>

    commit 67f5a4ba9741fcef3f4db3509ad03565d9e33af2 upstream.

    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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/usb/core/message.c | 11 ++++++++---
    1 file changed, 8 insertions(+), 3 deletions(-)

    --- a/drivers/usb/core/message.c
    +++ b/drivers/usb/core/message.c
    @@ -651,7 +651,7 @@ int usb_get_descriptor(struct usb_device
    if (result <= 0 && result != -ETIMEDOUT)
    continue;
    if (result > 1 && ((u8 *)buf)[1] != type) {
    - result = -EPROTO;
    + result = -ENODATA;
    continue;
    }
    break;
    @@ -694,8 +694,13 @@ static int usb_get_string(struct usb_dev
    USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
    (USB_DT_STRING << 8) + index, langid, buf, size,
    USB_CTRL_GET_TIMEOUT);
    - if (!(result == 0 || result == -EPIPE))
    - break;
    + if (result == 0 || result == -EPIPE)
    + continue;
    + if (result > 1 && ((u8 *) buf)[1] != USB_DT_STRING) {
    + result = -ENODATA;
    + continue;
    + }
    + break;
    }
    return result;
    }



    \
     
     \ /
      Last update: 2009-03-14 01:55    [W:4.310 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site