summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Dickens <christopher.a.dickens@gmail.com>2018-02-24 02:02:03 -0800
committerChris Dickens <christopher.a.dickens@gmail.com>2018-02-24 02:02:03 -0800
commit8e03a6586c54626fe8e62016258f7238f1872978 (patch)
tree7a87e436a944622ce59f60820b91543185c85c8b
parent8551e4a7a27c1aafac3138d0fb23821bfe3bf180 (diff)
downloadlibusb-8e03a6586c54626fe8e62016258f7238f1872978.tar.gz
Windows: UsbDk: Implement get_config_descriptor_by_value()
This fixes a NULL pointer dereference when the user selects the UsbDk backend and subsequently calls libusb_get_config_descriptor_by_value(). Closes #395 Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
-rw-r--r--libusb/os/windows_usbdk.c22
-rw-r--r--libusb/version_nano.h2
2 files changed, 21 insertions, 3 deletions
diff --git a/libusb/os/windows_usbdk.c b/libusb/os/windows_usbdk.c
index 6b16675..1355000 100644
--- a/libusb/os/windows_usbdk.c
+++ b/libusb/os/windows_usbdk.c
@@ -370,7 +370,25 @@ static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config
return (int)size;
}
-static inline int usbdk_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len)
+static int usbdk_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue,
+ unsigned char **buffer)
+{
+ struct usbdk_device_priv *priv = _usbdk_device_priv(dev);
+ PUSB_CONFIGURATION_DESCRIPTOR config_header;
+ uint8_t index;
+
+ for (index = 0; index < dev->num_configurations; index++) {
+ config_header = priv->config_descriptors[index];
+ if (config_header->bConfigurationValue == bConfigurationValue) {
+ *buffer = (unsigned char *)priv->config_descriptors[index];
+ return (int)config_header->wTotalLength;
+ }
+ }
+
+ return LIBUSB_ERROR_NOT_FOUND;
+}
+
+static int usbdk_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len)
{
return usbdk_get_config_descriptor(dev, _usbdk_device_priv(dev)->active_configuration,
buffer, len);
@@ -794,7 +812,7 @@ const struct windows_backend usbdk_backend = {
usbdk_get_device_descriptor,
usbdk_get_active_config_descriptor,
usbdk_get_config_descriptor,
- NULL,//usbdk_get_config_descriptor_by_value,
+ usbdk_get_config_descriptor_by_value,
usbdk_get_configuration,
usbdk_set_configuration,
usbdk_claim_interface,
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index 5d22c03..1617e40 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 11300
+#define LIBUSB_NANO 11301