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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]