[Spice-devel] [PATCH spice-gtk] session: correctly track main channel

Marc-André Lureau marcandre.lureau at gmail.com
Tue May 22 05:03:10 PDT 2012


The main channel can change when we are reconnecting to the server,
for example, when querying the password to the user. From there,
the old main channel is destroyed, but we don't track properly the
new main channel.

This fix migration crashing later on, because of missing main channel:
https://bugzilla.redhat.com/show_bug.cgi?id=823874
---
 gtk/spice-session.c |   32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/gtk/spice-session.c b/gtk/spice-session.c
index 17b1fe8..fface67 100644
--- a/gtk/spice-session.c
+++ b/gtk/spice-session.c
@@ -1613,6 +1613,9 @@ void spice_session_channel_new(SpiceSession *session, SpiceChannel *channel)
                      NULL);
         if (s->color_depth != 0)
             g_object_set(channel, "color-depth", s->color_depth, NULL);
+
+        SPICE_DEBUG("new main channel, switching");
+        s->cmain = channel;
     }
 
     g_signal_emit(session, signals[SPICE_SESSION_CHANNEL_NEW], 0, channel);
@@ -1623,7 +1626,7 @@ void spice_session_channel_destroy(SpiceSession *session, SpiceChannel *channel)
 {
     SpiceSessionPrivate *s = SPICE_SESSION_GET_PRIVATE(session);
     struct channel *item = NULL;
-    RingItem *ring, *next;
+    RingItem *ring;
 
     g_return_if_fail(s != NULL);
     g_return_if_fail(channel != NULL);
@@ -1632,22 +1635,23 @@ void spice_session_channel_destroy(SpiceSession *session, SpiceChannel *channel)
         s->migration_left = g_list_remove(s->migration_left, channel);
 
     for (ring = ring_get_head(&s->channels); ring != NULL;
-         ring = next) {
-        next = ring_next(&s->channels, ring);
+         ring = ring_next(&s->channels, ring)) {
         item = SPICE_CONTAINEROF(ring, struct channel, link);
-        if (item->channel == s->cmain) {
-            SPICE_DEBUG("the session lost the main channel");
-            s->cmain = NULL;
-        }
-        if (item->channel == channel) {
-            ring_remove(&item->link);
-            free(item);
-            g_signal_emit(session, signals[SPICE_SESSION_CHANNEL_DESTROY], 0, channel);
-            return;
-        }
+        if (item->channel == channel)
+            break;
+    }
+
+    g_return_if_fail(ring != NULL);
+
+    if (channel == s->cmain) {
+        SPICE_DEBUG("the session lost the main channel");
+        s->cmain = NULL;
     }
 
-    g_warn_if_reached();
+    ring_remove(&item->link);
+    free(item);
+
+    g_signal_emit(session, signals[SPICE_SESSION_CHANNEL_DESTROY], 0, channel);
 }
 
 G_GNUC_INTERNAL
-- 
1.7.10.1



More information about the Spice-devel mailing list