staging: rtl8712: add error handler in r8712_usbctrl_vendorreq()
authorWang Cheng <wanngchenng@gmail.com>
Mon, 16 May 2022 09:23:05 +0000 (17:23 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 May 2022 15:44:25 +0000 (17:44 +0200)
When 'status' returned from usb_control_msg() is not equal to 'len',
that usb_control_msg() is on partial failure, r8712_usbctrl_vendorreq()
will treat partial reads as success.

Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Wang Cheng <wanngchenng@gmail.com>
Link: https://lore.kernel.org/r/e33ea53d36c422fbe7eabec5bd9eecb0ebce1bc5.1652618244.git.wanngchenng@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8712/usb_ops_linux.c

index f984a5a..b2181e1 100644 (file)
@@ -495,14 +495,21 @@ int r8712_usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value,
        }
        status = usb_control_msg(udev, pipe, request, reqtype, value, index,
                                 pIo_buf, len, 500);
-       if (status > 0) {  /* Success this control transfer. */
-               if (requesttype == 0x01) {
-                       /* For Control read transfer, we have to copy the read
-                        * data from pIo_buf to pdata.
-                        */
-                       memcpy(pdata, pIo_buf,  status);
-               }
+       if (status < 0)
+               goto free;
+       if (status != len) {
+               status = -EREMOTEIO;
+               goto free;
+       }
+       /* Success this control transfer. */
+       if (requesttype == 0x01) {
+               /* For Control read transfer, we have to copy the read
+                * data from pIo_buf to pdata.
+                */
+               memcpy(pdata, pIo_buf, status);
        }
+
+free:
        kfree(palloc_buf);
        return status;
 }