SDL: hidapi/libusb: use the same logic to get the config descriptor in hid_open_path() as in hid_enumerate()

From 5de35a1d77e083c804cad2ed7feb1e2aa0913adf Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 24 May 2023 21:45:15 -0700
Subject: [PATCH] hidapi/libusb: use the same logic to get the config
 descriptor in hid_open_path() as in hid_enumerate()

Signed-off-by: Sam Lantinga <slouken@libsdl.org>
---
 src/hidapi/libusb/hid.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/hidapi/libusb/hid.c b/src/hidapi/libusb/hid.c
index b2fee1152f5c..430833f2ad32 100644
--- a/src/hidapi/libusb/hid.c
+++ b/src/hidapi/libusb/hid.c
@@ -769,6 +769,9 @@ struct hid_device_info  HID_API_EXPORT *hid_enumerate(unsigned short vendor_id,
 		int j, k;
 
 		int res = libusb_get_device_descriptor(dev, &desc);
+		if (res < 0)
+			continue;
+
 		unsigned short dev_vid = desc.idVendor;
 		unsigned short dev_pid = desc.idProduct;
 
@@ -1163,11 +1166,20 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
 
 	libusb_get_device_list(usb_context, &devs);
 	while ((usb_dev = devs[d++]) != NULL && !good_open) {
+		struct libusb_device_descriptor desc;
 		struct libusb_config_descriptor *conf_desc = NULL;
 		int j,k;
 
-		if (libusb_get_active_config_descriptor(usb_dev, &conf_desc) < 0)
+		res = libusb_get_device_descriptor(usb_dev, &desc);
+		if (res < 0)
 			continue;
+
+		res = libusb_get_active_config_descriptor(usb_dev, &conf_desc);
+		if (res < 0)
+			libusb_get_config_descriptor(usb_dev, 0, &conf_desc);
+		if (!conf_desc)
+			continue;
+
 		for (j = 0; j < conf_desc->bNumInterfaces && !good_open; j++) {
 			const struct libusb_interface *intf = &conf_desc->interface[j];
 			for (k = 0; k < intf->num_altsetting && !good_open; k++) {