From: Kirill Moizik <kmoizik@xxxxxxxxxx> This commit adds locking to ensure thread safety required after start/stop redirection flows moved to separate threads. Signed-off-by: Kirill Moizik <kmoizik@xxxxxxxxxx> Signed-off-by: Dmitry Fleytman <dfleytma@xxxxxxxxxx> --- src/channel-usbredir.c | 6 ++++++ src/usb-device-manager.c | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c index a95db8a..bbfd2b0 100644 --- a/src/channel-usbredir.c +++ b/src/channel-usbredir.c @@ -657,12 +657,17 @@ static void usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *in) priv->read_buf = buf; priv->read_buf_size = size; + g_mutex_lock(priv->flows_mutex); r = usbredirhost_read_guest_data(priv->host); if (r != 0) { SpiceUsbDevice *spice_device = priv->spice_device; gchar *desc; GError *err; + if (spice_device == NULL) + { + g_mutex_unlock(priv->flows_mutex); + } g_return_if_fail(spice_device != NULL); desc = spice_usb_device_get_description(spice_device, NULL); @@ -700,6 +705,7 @@ static void usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *in) g_error_free(err); } + g_mutex_unlock(priv->flows_mutex); } #endif /* USE_USBREDIR */ diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c index 58e4042..af2c87a 100644 --- a/src/usb-device-manager.c +++ b/src/usb-device-manager.c @@ -1360,9 +1360,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; @@ -1689,9 +1693,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, -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel