[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 04:23:43 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