diff options
author | Ondrej Čerman <ondrej.cerman@gmail.com> | 2019-07-26 21:48:22 +0200 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2019-07-29 19:44:04 -0700 |
commit | e71298e11039fd1b22758097410fdca52b8610a2 (patch) | |
tree | 59c40e2d666f1d2d6b0bd3097f9fa9b145c55fcc | |
parent | bc1b620dc15153dad08065eb8af0fc84374a3d76 (diff) |
usb: Workaround when lsusb parses same interface multiple times
-rw-r--r-- | hardinfo/usb_util.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/hardinfo/usb_util.c b/hardinfo/usb_util.c index 562fa8f5..845dbd2a 100644 --- a/hardinfo/usb_util.c +++ b/hardinfo/usb_util.c @@ -126,18 +126,24 @@ static usbd *usbd_list_append_sorted(usbd *l, usbd *n) { return t; } -void usbd_append_interface(usbd *dev, usbi *new_if){ +gboolean usbd_append_interface(usbd *dev, usbi *new_if){ usbi *curr_if; if (dev->if_list == NULL){ dev->if_list = new_if; - return; + return TRUE; } + if (dev->if_list->if_number == new_if->if_number) + return FALSE; + curr_if = dev->if_list; while(curr_if->next != NULL) { curr_if = curr_if->next; + if (curr_if->if_number == new_if->if_number) + return FALSE; } curr_if->next = new_if; + return TRUE; } int usbd_list_count(usbd *s) { @@ -201,7 +207,15 @@ static gboolean usb_get_device_lsusb(int bus, int dev, usbd *s) { } else if (l = lsusb_line_value(p, "bInterfaceNumber")) { curr_if = usbi_new(); curr_if->if_number = atoi(l); - usbd_append_interface(s, curr_if); + + // This may parse same interface multiple times when there + // are multiple Configuration descriptors per device + // As a workaround usbd_append_interface appends interface + // with same if_number only once + if (!usbd_append_interface(s, curr_if)){ + usbi_free(curr_if); + curr_if = NULL; + } } else if (l = lsusb_line_value(p, "bInterfaceClass")) { if (curr_if != NULL){ curr_if->if_class = atoi(l); @@ -290,7 +304,9 @@ static gboolean usb_get_device_sysfs(int bus, int dev, const char* sysfspath, us intf = usbi_new(); ok = usb_get_interface_sysfs(conf, i, sysfspath, intf); if (ok){ - usbd_append_interface(s, intf); + if (!usbd_append_interface(s, intf)){ + usbi_free(intf); + } } else{ usbi_free(intf); |