[virt-tools-list] [PATCH virt-viewer] spice: calling VirtViewerSession:close() can destroy self

Marc-André Lureau marcandre.lureau at gmail.com
Tue Nov 25 11:57:39 UTC 2014

SpiceSession in spice-gtk v0.27 removes channels from session during
disconnect (and not when they are actually disposed). When no channels
are left, session-disconnected is emitted, and the VirtViewerSession
will be unref from the application. Use a weak reference to self to
avoid crashing after calling spice_session_disconnect()

As a workaround for existing clients, spice-gtk v0.27 will defer the
disconnection to idle time.  But the fix still makes sense and would
prevent potentially future issues if spice-gtk changes back to sync

(the alternative of calling ref/unref would keep recreating session,
 which is something it can avoid when leaving the application)
 src/virt-viewer-session-spice.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index c459d96..ebe78fc 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -292,16 +292,23 @@ virt_viewer_session_spice_close(VirtViewerSession *session)
     g_return_if_fail(self != NULL);
+    g_object_add_weak_pointer(G_OBJECT(self), (gpointer*)&self);
     if (self->priv->session) {
+        if (!self)
+            return;
         self->priv->session = NULL;
         self->priv->gtk_session = NULL;
         self->priv->audio = NULL;
+    g_object_remove_weak_pointer(G_OBJECT(self), (gpointer*)&self);
     /* FIXME: version 0.7 of spice-gtk allows reuse of session */

More information about the virt-tools-list mailing list