Author: hselasky
Date: Tue Jun 26 16:00:16 2018
New Revision: 335669
URL: https://svnweb.freebsd.org/changeset/base/335669

Log:
  Improve the userspace USB string reading function in LibUSB.
  Some USB devices does not allow a partial descriptor readout.
  
  Found by:             bz @
  MFC after:            1 week
  Sponsored by:         Mellanox Technologies

Modified:
  head/lib/libusb/libusb20.c

Modified: head/lib/libusb/libusb20.c
==============================================================================
--- head/lib/libusb/libusb20.c  Tue Jun 26 15:00:54 2018        (r335668)
+++ head/lib/libusb/libusb20.c  Tue Jun 26 16:00:16 2018        (r335669)
@@ -814,6 +814,7 @@ libusb20_dev_req_string_sync(struct libusb20_device *p
 {
        struct LIBUSB20_CONTROL_SETUP_DECODED req;
        int error;
+       int flags;
 
        /* make sure memory is initialised */
        memset(ptr, 0, len);
@@ -840,22 +841,24 @@ libusb20_dev_req_string_sync(struct libusb20_device *p
        error = libusb20_dev_request_sync(pdev, &req,
            ptr, NULL, 1000, LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK);
        if (error) {
-               return (error);
+               /* try to request full string */
+               req.wLength = 255;
+               flags = 0;
+       } else {
+               /* extract length and request full string */
+               req.wLength = *(uint8_t *)ptr;
+               flags = LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK;
        }
-       req.wLength = *(uint8_t *)ptr;  /* bytes */
        if (req.wLength > len) {
                /* partial string read */
                req.wLength = len;
        }
-       error = libusb20_dev_request_sync(pdev, &req,
-           ptr, NULL, 1000, LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK);
-
-       if (error) {
+       error = libusb20_dev_request_sync(pdev, &req, ptr, NULL, 1000, flags);
+       if (error)
                return (error);
-       }
-       if (((uint8_t *)ptr)[1] != LIBUSB20_DT_STRING) {
+
+       if (((uint8_t *)ptr)[1] != LIBUSB20_DT_STRING)
                return (LIBUSB20_ERROR_OTHER);
-       }
        return (0);                     /* success */
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to