windows: Allow GUID with and without trailing zeroes
authorCraig Hutchinson <54269136+CraigHutchinson@users.noreply.github.com>
Tue, 8 Jun 2021 18:03:43 +0000 (20:03 +0200)
committerNathan Hjelm <hjelmn@google.com>
Fri, 9 Jul 2021 03:52:14 +0000 (21:52 -0600)
Improve the GUID length check to accommodate the cases where the GUID
string fetched from registry does not have a trailing zero, or if a
multi-string entry, one or two trailing zeroes.

Closes #927

Signed-off-by: Craig Hutchinson <54269136+CraigHutchinson@users.noreply.github.com>
[Tormod: Use correct types and simplify comparisons]
Signed-off-by: Tormod Volden <debian.tormod@gmail.com>
Signed-off-by: Nathan Hjelm <hjelmn@google.com>
libusb/os/windows_winusb.c
libusb/version_nano.h

index cdca6cb..1fdc703 100644 (file)
@@ -1626,9 +1626,15 @@ static int winusb_get_device_list(struct libusb_context *ctx, struct discovered_
                                        s = pRegQueryValueExA(key, "DeviceInterfaceGUID", NULL, &reg_type,
                                                (LPBYTE)guid_string, &size);
                                pRegCloseKey(key);
-                               if ((s == ERROR_SUCCESS) &&
-                                   (((reg_type == REG_SZ) && (size == (sizeof(guid_string) - sizeof(char)))) ||
-                                    ((reg_type == REG_MULTI_SZ) && (size == sizeof(guid_string))))) {
+                               if (s != ERROR_SUCCESS) {
+                                       usbi_warn(ctx, "unexpected error from pRegQueryValueExA for '%s'", dev_id);
+                                       break;
+                               }
+                               // https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexa#remarks
+                               // - "string may not have been stored with the proper terminating null characters"
+                               // - "Note that REG_MULTI_SZ strings could have two terminating null characters"
+                               if ((reg_type == REG_SZ && size >= sizeof(guid_string) - sizeof(char))
+                                   || (reg_type == REG_MULTI_SZ && size >= sizeof(guid_string) - 2 * sizeof(char))) {
                                        if (nb_guids == guid_size) {
                                                new_guid_list = realloc((void *)guid_list, (guid_size + GUID_SIZE_STEP) * sizeof(void *));
                                                if (new_guid_list == NULL) {
@@ -1660,7 +1666,7 @@ static int winusb_get_device_list(struct libusb_context *ctx, struct discovered_
                                                        free(if_guid);
                                                }
                                        }
-                               } else if (s == ERROR_SUCCESS) {
+                               } else {
                                        usbi_warn(ctx, "unexpected type/size of DeviceInterfaceGUID for '%s'", dev_id);
                                }
                                break;
index 20dc30c..b2f7e4a 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11631
+#define LIBUSB_NANO 11632