lkml.org 
[lkml]   [2017]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 046/212] USB: serial: io_edgeport: fix descriptor error handling
    3.16.44-rc1 review patch.  If anyone has any objections, please let me know.

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

    From: Johan Hovold <johan@kernel.org>

    commit 3c0e25d883d06a1fbd1ad35257e8abaa57befb37 upstream.

    Make sure to detect short control-message transfers and log an error
    when reading incomplete manufacturer and boot descriptors.

    Note that the default all-zero descriptors will now be used after a
    short transfer is detected instead of partially initialised ones.

    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/usb/serial/io_edgeport.c | 24 +++++++++++++++---------
    1 file changed, 15 insertions(+), 9 deletions(-)

    --- a/drivers/usb/serial/io_edgeport.c
    +++ b/drivers/usb/serial/io_edgeport.c
    @@ -2109,8 +2109,7 @@ static int rom_write(struct usb_serial *
    * rom_read
    * reads a number of bytes from the Edgeport device starting at the given
    * address.
    - * If successful returns the number of bytes read, otherwise it returns
    - * a negative error number of the problem.
    + * Returns zero on success or a negative error number.
    ****************************************************************************/
    static int rom_read(struct usb_serial *serial, __u16 extAddr,
    __u16 addr, __u16 length, __u8 *data)
    @@ -2135,12 +2134,17 @@ static int rom_read(struct usb_serial *s
    USB_REQUEST_ION_READ_ROM,
    0xC0, addr, extAddr, transfer_buffer,
    current_length, 300);
    - if (result < 0)
    + if (result < current_length) {
    + if (result >= 0)
    + result = -EIO;
    break;
    + }
    memcpy(data, transfer_buffer, current_length);
    length -= current_length;
    addr += current_length;
    data += current_length;
    +
    + result = 0;
    }

    kfree(transfer_buffer);
    @@ -2597,9 +2601,10 @@ static void get_manufacturing_desc(struc
    EDGE_MANUF_DESC_LEN,
    (__u8 *)(&edge_serial->manuf_descriptor));

    - if (response < 1)
    - dev_err(dev, "error in getting manufacturer descriptor\n");
    - else {
    + if (response < 0) {
    + dev_err(dev, "error in getting manufacturer descriptor: %d\n",
    + response);
    + } else {
    char string[30];
    dev_dbg(dev, "**Manufacturer Descriptor\n");
    dev_dbg(dev, " RomSize: %dK\n",
    @@ -2656,9 +2661,10 @@ static void get_boot_desc(struct edgepor
    EDGE_BOOT_DESC_LEN,
    (__u8 *)(&edge_serial->boot_descriptor));

    - if (response < 1)
    - dev_err(dev, "error in getting boot descriptor\n");
    - else {
    + if (response < 0) {
    + dev_err(dev, "error in getting boot descriptor: %d\n",
    + response);
    + } else {
    dev_dbg(dev, "**Boot Descriptor:\n");
    dev_dbg(dev, " BootCodeLength: %d\n",
    le16_to_cpu(edge_serial->boot_descriptor.BootCodeLength));
    \
     
     \ /
      Last update: 2017-06-01 18:38    [W:4.070 / U:0.276 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site