[Spice-devel] [PATCH spice-gtk 7/8] Check if msg are permitted to be sent in read-only

Marc-André Lureau marcandre.lureau at gmail.com
Wed Nov 23 07:43:11 PST 2011


---
 gtk/spice-channel-priv.h |    1 +
 gtk/spice-channel.c      |   35 +++++++++++++++++++++++++++++++++--
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/gtk/spice-channel-priv.h b/gtk/spice-channel-priv.h
index 86b22e1..df661f8 100644
--- a/gtk/spice-channel-priv.h
+++ b/gtk/spice-channel-priv.h
@@ -46,6 +46,7 @@ struct _SpiceMsgOut {
     SpiceMessageMarshallers *marshallers;
     SpiceMarshaller       *marshaller;
     SpiceDataHeader       *header;
+    gboolean              ro_check;
 };
 
 struct _SpiceMsgIn {
diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c
index 99af206..c2133ab 100644
--- a/gtk/spice-channel.c
+++ b/gtk/spice-channel.c
@@ -465,6 +465,30 @@ void spice_msg_out_hexdump(SpiceMsgOut *out, unsigned char *data, int len)
     hexdump(">> msg", data, len);
 }
 
+static gboolean msg_check_read_only (int channel_type, int msg_type)
+{
+    if (msg_type < 100) // those are the common messages
+        return FALSE;
+
+    switch (channel_type) {
+    /* messages allowed to be sent in read-only mode */
+    case SPICE_CHANNEL_MAIN:
+        switch (msg_type) {
+        case SPICE_MSGC_MAIN_CLIENT_INFO:
+        case SPICE_MSGC_MAIN_MIGRATE_CONNECTED:
+        case SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR:
+        case SPICE_MSGC_MAIN_ATTACH_CHANNELS:
+        case SPICE_MSGC_MAIN_MIGRATE_END:
+            return FALSE;
+        }
+        break;
+    case SPICE_CHANNEL_DISPLAY:
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
 G_GNUC_INTERNAL
 SpiceMsgOut *spice_msg_out_new(SpiceChannel *channel, int type)
 {
@@ -476,6 +500,7 @@ SpiceMsgOut *spice_msg_out_new(SpiceChannel *channel, int type)
     out = spice_new0(SpiceMsgOut, 1);
     out->refcount = 1;
     out->channel  = channel;
+    out->ro_check = msg_check_read_only(c->channel_type, type);
 
     out->marshallers = c->marshallers;
     out->marshaller = spice_marshaller_new();
@@ -1547,6 +1572,12 @@ static void spice_channel_send_msg(SpiceChannel *channel, SpiceMsgOut *out, gboo
     g_return_if_fail(channel != NULL);
     g_return_if_fail(out != NULL);
 
+    if (out->ro_check &&
+        spice_session_get_read_only(channel->priv->session)) {
+        g_warning("Try to send message while read-only. Please report a bug.");
+        return;
+    }
+
     data = spice_marshaller_linearize(out->marshaller, 0,
                                       &len, &free_data);
     /* spice_msg_out_hexdump(out, data, len); */
@@ -1554,9 +1585,9 @@ static void spice_channel_send_msg(SpiceChannel *channel, SpiceMsgOut *out, gboo
         spice_channel_buffered_write(channel, data, len);
     else
         spice_channel_write(channel, data, len);
-    if (free_data) {
+
+    if (free_data)
         free(data);
-    }
 }
 
 /* coroutine context */
-- 
1.7.7



More information about the Spice-devel mailing list