summaryrefslogtreecommitdiffstats
path: root/third_party/libusb
diff options
context:
space:
mode:
authorreillyg <reillyg@chromium.org>2015-03-23 15:48:30 -0700
committerCommit bot <commit-bot@chromium.org>2015-03-23 22:49:21 +0000
commite56e8ef67c39f1a6ea256939ec8f6f5ee82e59cf (patch)
treebb87f38a7ad406cba65fcd977590af6dfb194ad8 /third_party/libusb
parent128fddc8e9fa0e74f41d152c7cd62c0c31275ebe (diff)
downloadchromium_src-e56e8ef67c39f1a6ea256939ec8f6f5ee82e59cf.zip
chromium_src-e56e8ef67c39f1a6ea256939ec8f6f5ee82e59cf.tar.gz
chromium_src-e56e8ef67c39f1a6ea256939ec8f6f5ee82e59cf.tar.bz2
libusb: Fix composite_close to close HID handles as well.
When opening a composite device some combination of the WinUSB and HID APIs may be used. This patch fixes composite_close to close both WinUSB file handles and HID file handles. BUG=466578 Review URL: https://codereview.chromium.org/1032563002 Cr-Commit-Position: refs/heads/master@{#321881}
Diffstat (limited to 'third_party/libusb')
-rw-r--r--third_party/libusb/README.chromium1
-rw-r--r--third_party/libusb/composite-hid-close.patch32
-rw-r--r--third_party/libusb/src/libusb/os/windows_usb.c7
3 files changed, 40 insertions, 0 deletions
diff --git a/third_party/libusb/README.chromium b/third_party/libusb/README.chromium
index c00bdd2..fc81c05 100644
--- a/third_party/libusb/README.chromium
+++ b/third_party/libusb/README.chromium
@@ -18,3 +18,4 @@ Local Modifications:
- darwin-sigfpe.patch has been applied.
- upstream-tick147.patch has been applied.
- linux-udev.patch has been applied.
+- composite-hid-close.patch has been applied.
diff --git a/third_party/libusb/composite-hid-close.patch b/third_party/libusb/composite-hid-close.patch
new file mode 100644
index 0000000..d6749cf
--- /dev/null
+++ b/third_party/libusb/composite-hid-close.patch
@@ -0,0 +1,32 @@
+diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c
+index 9ae11b1..259897e 100644
+--- a/libusb/os/windows_usb.c
++++ b/libusb/os/windows_usb.c
+@@ -4236,6 +4236,7 @@ static void composite_close(int sub_api, struct libusb_device_handle *dev_handle
+ struct windows_device_priv *priv = _device_priv(dev_handle->dev);
+ uint8_t i;
+ bool available[SUB_API_MAX];
++ bool has_hid = false;
+
+ for (i = 0; i<SUB_API_MAX; i++) {
+ available[i] = false;
+@@ -4245,6 +4246,8 @@ static void composite_close(int sub_api, struct libusb_device_handle *dev_handle
+ if ( (priv->usb_interface[i].apib->id == USB_API_WINUSBX)
+ && (priv->usb_interface[i].sub_api != SUB_API_NOTSET) ) {
+ available[priv->usb_interface[i].sub_api] = true;
++ } else if (priv->usb_interface[i].apib->id == USB_API_HID) {
++ has_hid = true;
+ }
+ }
+
+@@ -4253,6 +4256,10 @@ static void composite_close(int sub_api, struct libusb_device_handle *dev_handle
+ usb_api_backend[USB_API_WINUSBX].close(i, dev_handle);
+ }
+ }
++
++ if (has_hid) {
++ usb_api_backend[USB_API_HID].close(sub_api, dev_handle);
++ }
+ }
+
+ static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)
diff --git a/third_party/libusb/src/libusb/os/windows_usb.c b/third_party/libusb/src/libusb/os/windows_usb.c
index 9ae11b1..259897e 100644
--- a/third_party/libusb/src/libusb/os/windows_usb.c
+++ b/third_party/libusb/src/libusb/os/windows_usb.c
@@ -4236,6 +4236,7 @@ static void composite_close(int sub_api, struct libusb_device_handle *dev_handle
struct windows_device_priv *priv = _device_priv(dev_handle->dev);
uint8_t i;
bool available[SUB_API_MAX];
+ bool has_hid = false;
for (i = 0; i<SUB_API_MAX; i++) {
available[i] = false;
@@ -4245,6 +4246,8 @@ static void composite_close(int sub_api, struct libusb_device_handle *dev_handle
if ( (priv->usb_interface[i].apib->id == USB_API_WINUSBX)
&& (priv->usb_interface[i].sub_api != SUB_API_NOTSET) ) {
available[priv->usb_interface[i].sub_api] = true;
+ } else if (priv->usb_interface[i].apib->id == USB_API_HID) {
+ has_hid = true;
}
}
@@ -4253,6 +4256,10 @@ static void composite_close(int sub_api, struct libusb_device_handle *dev_handle
usb_api_backend[USB_API_WINUSBX].close(i, dev_handle);
}
}
+
+ if (has_hid) {
+ usb_api_backend[USB_API_HID].close(sub_api, dev_handle);
+ }
}
static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)