[Spice-devel] [spice-gtk 04/13] usb-redir: do not add device if one with the same bus:addr exists

Yuri Benditovich yuri.benditovich at daynix.com
Sun Mar 10 14:46:03 UTC 2019


In initial device enumeration hotplug notification can be
called twice with the same libusb device. For details, see
http://libusb.sourceforge.net/api-1.0/group__libusb__hotplug.html#ga00e0c69ddf1fb1b6774dc918192e8dc7
Filter out devices that already present in the list.
Remove indentical call in spice_usb_device_manager_add_udev,
which add devices under Windows.

Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com>
---
 src/usb-device-manager.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
index debba4d..5cf7ebb 100644
--- a/src/usb-device-manager.c
+++ b/src/usb-device-manager.c
@@ -962,6 +962,17 @@ static void spice_usb_device_manager_add_dev(SpiceUsbDeviceManager  *self,
     if (desc.bDeviceClass == LIBUSB_CLASS_HUB)
         return;
 
+    if (spice_usb_device_manager_find_device(self,
+                                    libusb_get_bus_number(libdev),
+                                    libusb_get_device_address(libdev))) {
+        SPICE_DEBUG("device not added %d:%d %04x:%04x",
+                    libusb_get_bus_number(libdev),
+                    libusb_get_device_address(libdev),
+                    desc.idVendor,
+                    desc.idProduct);
+        return;
+    }
+
     device = (SpiceUsbDevice*)spice_usb_device_new(libdev);
     if (!device)
         return;
@@ -1025,7 +1036,6 @@ static void spice_usb_device_manager_add_udev(SpiceUsbDeviceManager  *self,
 {
     SpiceUsbDeviceManagerPrivate *priv = self->priv;
     libusb_device *libdev = NULL, **dev_list = NULL;
-    SpiceUsbDevice *device;
     const gchar *devtype;
     int i, bus, address;
 
@@ -1039,16 +1049,6 @@ static void spice_usb_device_manager_add_udev(SpiceUsbDeviceManager  *self,
         return;
     }
 
-    device = spice_usb_device_manager_find_device(self, bus, address);
-    if (device) {
-        SPICE_DEBUG("USB device 0x%04x:0x%04x at %d.%d already exists, ignored",
-                    spice_usb_device_get_vid(device),
-                    spice_usb_device_get_pid(device),
-                    spice_usb_device_get_busnum(device),
-                    spice_usb_device_get_devaddr(device));
-        return;
-    }
-
     if (priv->coldplug_list)
         dev_list = priv->coldplug_list;
     else
-- 
2.17.1



More information about the Spice-devel mailing list