diff options
-rw-r--r-- | src/channel-usbredir.c | 9 | ||||
-rw-r--r-- | src/usb-device-manager.c | 12 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c index ff238e5..a2a9343 100644 --- a/src/channel-usbredir.c +++ b/src/channel-usbredir.c @@ -656,6 +656,8 @@ static void usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *in) priv->read_buf = buf; priv->read_buf_size = size; + spice_usbredir_channel_lock(channel); + r = usbredirhost_read_guest_data(priv->host); if (r != 0) { SpiceUsbDevice *spice_device = priv->spice_device; @@ -663,7 +665,10 @@ static void usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *in) gchar *desc; GError *err; - g_return_if_fail(spice_device != NULL); + if (spice_device == NULL) { + spice_usbredir_channel_unlock(channel); + return; + } desc = spice_usb_device_get_description(spice_device, NULL); switch (r) { @@ -700,6 +705,8 @@ static void usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *in) g_error_free(err); } + + spice_usbredir_channel_unlock(channel); } #endif /* USE_USBREDIR */ diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c index be8b517..3872bb6 100644 --- a/src/usb-device-manager.c +++ b/src/usb-device-manager.c @@ -1353,9 +1353,13 @@ static SpiceUsbredirChannel *spice_usb_device_manager_get_channel_for_dev( for (i = 0; i < priv->channels->len; i++) { SpiceUsbredirChannel *channel = g_ptr_array_index(priv->channels, i); + spice_usbredir_channel_lock(channel); libusb_device *libdev = spice_usbredir_channel_get_device(channel); - if (spice_usb_manager_device_equal_libdev(manager, device, libdev)) + if (spice_usb_manager_device_equal_libdev(manager, device, libdev)) { + spice_usbredir_channel_unlock(channel); return channel; + } + spice_usbredir_channel_unlock(channel); } #endif return NULL; @@ -1749,9 +1753,13 @@ spice_usb_device_manager_can_redirect_device(SpiceUsbDeviceManager *self, /* Check if there are free channels */ for (i = 0; i < priv->channels->len; i++) { SpiceUsbredirChannel *channel = g_ptr_array_index(priv->channels, i); + spice_usbredir_channel_lock(channel); - if (!spice_usbredir_channel_get_device(channel)) + if (!spice_usbredir_channel_get_device(channel)){ + spice_usbredir_channel_unlock(channel); break; + } + spice_usbredir_channel_unlock(channel); } if (i == priv->channels->len) { g_set_error_literal(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED, |