summaryrefslogtreecommitdiff
path: root/libusb
diff options
context:
space:
mode:
Diffstat (limited to 'libusb')
-rw-r--r--libusb/os/windows_winusb.c10
-rw-r--r--libusb/os/windows_winusb.h6
-rw-r--r--libusb/version_nano.h2
3 files changed, 13 insertions, 5 deletions
diff --git a/libusb/os/windows_winusb.c b/libusb/os/windows_winusb.c
index bccedb9..2371096 100644
--- a/libusb/os/windows_winusb.c
+++ b/libusb/os/windows_winusb.c
@@ -974,6 +974,16 @@ static int cache_config_descriptors(struct libusb_device *dev, HANDLE hub_handle
LOOP_BREAK(LIBUSB_ERROR_NO_MEM);
memcpy(priv->config_descriptor[i], cd_data, cd_data->wTotalLength);
}
+
+ // Any failure will result in dev->num_configurations being forced to 0.
+ // We need to release any memory that may have been allocated for config
+ // descriptors that were successfully retrieved, otherwise that memory
+ // will be leaked
+ if (r != LIBUSB_SUCCESS) {
+ for (i = 0; i < dev->num_configurations; i++)
+ free(priv->config_descriptor[i]);
+ }
+
return r;
}
diff --git a/libusb/os/windows_winusb.h b/libusb/os/windows_winusb.h
index b7b9cd9..1c8ee34 100644
--- a/libusb/os/windows_winusb.h
+++ b/libusb/os/windows_winusb.h
@@ -244,10 +244,8 @@ static inline void windows_device_priv_release(struct libusb_device *dev)
int i;
free(p->path);
- if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) {
- for (i = 0; i < dev->num_configurations; i++)
- free(p->config_descriptor[i]);
- }
+ for (i = 0; i < dev->num_configurations; i++)
+ free(p->config_descriptor[i]);
free(p->config_descriptor);
free(p->hid);
for (i = 0; i < USB_MAXINTERFACES; i++) {
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index f75412b..e2bf2ec 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 11195
+#define LIBUSB_NANO 11196