diff --git a/0001-usbredir-Check-for-existing-usb-channels-after-libus.patch b/0001-usbredir-Check-for-existing-usb-channels-after-libus.patch new file mode 100644 index 0000000..6660227 --- /dev/null +++ b/0001-usbredir-Check-for-existing-usb-channels-after-libus.patch @@ -0,0 +1,154 @@ +From 434adeb05b0d8aef0d983b346bd820287db22eae Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 14 Mar 2012 09:41:19 +0100 +Subject: [PATCH spice-gtk 1/2] usbredir: Check for existing usb channels + after libusb init + +Currently trying to view a usbredir enabled vm from virt-manager causes +virt-manager to crash. This crash is caused by the following happening: + +-virt-manager sets up the session, including connecting all the channels +-a spice-gtk internal code path calls spice_usb_device_manager_get() +-spice_usb_device_manager_get calls channel_new on all already connected + usb channels +-channel_new does: + spice_usbredir_channel_set_context(SPICE_USBREDIR_CHANNEL(channel), + self->priv->context); +-But self->priv->context has not been set yet (so is NULL) -> segfault! + +This patch fixes this by moving the iterating over already connected +usb channels to after the setting of self->priv->context. Note this means +that the channels will no longer get checked when there is no USB_REDIR +support. That is not a problem since spice_usb_device_manager_initable_init +will return FALSE in that case anyways. + +Signed-off-by: Hans de Goede +--- + gtk/usb-device-manager.c | 45 +++++++++++++++++++++------------------------ + 1 file changed, 21 insertions(+), 24 deletions(-) + +diff --git a/gtk/usb-device-manager.c b/gtk/usb-device-manager.c +index 29e9b4c..14b60c9 100644 +--- a/gtk/usb-device-manager.c ++++ b/gtk/usb-device-manager.c +@@ -62,13 +62,6 @@ + */ + + /* ------------------------------------------------------------------ */ +-/* Prototypes for private functions */ +-static void channel_new(SpiceSession *session, SpiceChannel *channel, +- gpointer user_data); +-static void channel_destroy(SpiceSession *session, SpiceChannel *channel, +- gpointer user_data); +- +-/* ------------------------------------------------------------------ */ + /* gobject glue */ + + #define SPICE_USB_DEVICE_MANAGER_GET_PRIVATE(obj) \ +@@ -109,6 +102,10 @@ struct _SpiceUsbDeviceManagerPrivate { + }; + + #ifdef USE_USBREDIR ++static void channel_new(SpiceSession *session, SpiceChannel *channel, ++ gpointer user_data); ++static void channel_destroy(SpiceSession *session, SpiceChannel *channel, ++ gpointer user_data); + static void spice_usb_device_manager_uevent_cb(GUdevClient *client, + const gchar *action, + GUdevDevice *udevice, +@@ -148,11 +145,11 @@ static gboolean spice_usb_device_manager_initable_init(GInitable *initable, + GCancellable *cancellable, + GError **err) + { +- GList *list; +- GList *it; + SpiceUsbDeviceManager *self; + SpiceUsbDeviceManagerPrivate *priv; + #ifdef USE_USBREDIR ++ GList *list; ++ GList *it; + int rc; + const gchar *const subsystems[] = {"usb", NULL}; + #endif +@@ -175,17 +172,8 @@ static gboolean spice_usb_device_manager_initable_init(GInitable *initable, + return FALSE; + } + +- g_signal_connect(priv->session, "channel-new", +- G_CALLBACK(channel_new), self); +- g_signal_connect(priv->session, "channel-destroy", +- G_CALLBACK(channel_destroy), self); +- list = spice_session_get_channels(priv->session); +- for (it = g_list_first(list); it != NULL; it = g_list_next(it)) { +- channel_new(priv->session, it->data, (gpointer*)self); +- } +- g_list_free(list); +- + #ifdef USE_USBREDIR ++ /* Initialize libusb */ + rc = libusb_init(&priv->context); + if (rc < 0) { + const char *desc = spice_usbutil_libusb_strerror(rc); +@@ -195,6 +183,18 @@ static gboolean spice_usb_device_manager_initable_init(GInitable *initable, + return FALSE; + } + ++ /* Start listening for usb channels connect/disconnect */ ++ g_signal_connect(priv->session, "channel-new", ++ G_CALLBACK(channel_new), self); ++ g_signal_connect(priv->session, "channel-destroy", ++ G_CALLBACK(channel_destroy), self); ++ list = spice_session_get_channels(priv->session); ++ for (it = g_list_first(list); it != NULL; it = g_list_next(it)) { ++ channel_new(priv->session, it->data, (gpointer*)self); ++ } ++ g_list_free(list); ++ ++ /* Start listening for usb devices plug / unplug */ + priv->udev = g_udev_client_new(subsystems); + g_signal_connect(G_OBJECT(priv->udev), "uevent", + G_CALLBACK(spice_usb_device_manager_uevent_cb), self); +@@ -460,10 +460,11 @@ static void spice_usb_device_manager_class_init(SpiceUsbDeviceManagerClass *klas + g_type_class_add_private(klass, sizeof(SpiceUsbDeviceManagerPrivate)); + } + ++#ifdef USE_USBREDIR ++ + /* ------------------------------------------------------------------ */ + /* gudev / libusb Helper functions */ + +-#ifdef USE_USBREDIR + static gboolean spice_usb_device_manager_get_udev_bus_n_address( + GUdevDevice *udev, int *bus, int *address) + { +@@ -480,7 +481,6 @@ static gboolean spice_usb_device_manager_get_udev_bus_n_address( + + return *bus && *address; + } +-#endif + + /* ------------------------------------------------------------------ */ + /* callbacks */ +@@ -491,11 +491,9 @@ static void channel_new(SpiceSession *session, SpiceChannel *channel, + SpiceUsbDeviceManager *self = user_data; + + if (SPICE_IS_USBREDIR_CHANNEL(channel)) { +-#ifdef USE_USBREDIR + spice_usbredir_channel_set_context(SPICE_USBREDIR_CHANNEL(channel), + self->priv->context); + spice_channel_connect(channel); +-#endif + g_ptr_array_add(self->priv->channels, channel); + } + } +@@ -509,7 +507,6 @@ static void channel_destroy(SpiceSession *session, SpiceChannel *channel, + g_ptr_array_remove(self->priv->channels, channel); + } + +-#ifdef USE_USBREDIR + static void spice_usb_device_manager_auto_connect_cb(GObject *gobject, + GAsyncResult *res, + gpointer user_data) +-- +1.7.9.3 + diff --git a/spice-gtk.spec b/spice-gtk.spec index 6bb19ac..8e07273 100644 --- a/spice-gtk.spec +++ b/spice-gtk.spec @@ -13,13 +13,14 @@ Name: spice-gtk Version: 0.11 -Release: 2%{?dist} +Release: 3%{?dist} Summary: A GTK+ widget for SPICE clients Group: System Environment/Libraries License: LGPLv2+ URL: http://spice-space.org/page/Spice-Gtk Source0: http://www.spice-space.org/download/gtk/%{name}-%{version}%{?_version_suffix}.tar.bz2 +Patch0: 0001-usbredir-Check-for-existing-usb-channels-after-libus.patch BuildRequires: intltool BuildRequires: gtk2-devel >= 2.14 @@ -144,6 +145,10 @@ if [ -n '%{?_version_suffix}' ]; then mv spice-gtk-%{version}%{?_version_suffix} spice-gtk-%{version} fi +pushd spice-gtk-%{version} +%patch0 -p1 +popd + %if %{with_gtk3} cp -a spice-gtk-%{version} spice-gtk3-%{version} %endif @@ -254,6 +259,10 @@ rm -f %{buildroot}%{_libdir}/python*/site-packages/*.la %{_bindir}/spicy-stats %changelog +* Wed Mar 14 2012 Hans de Goede - 0.11-3 +- Fix a crash triggered when trying to view a usbredir enabled vm from + virt-manager + * Mon Mar 12 2012 Hans de Goede - 0.11-2 - Add back spice-protocol BuildRequires to help some deps magic happen