[Spice-commits] server/agent-msg-filter.c server/agent-msg-filter.h server/reds.c

Frediano Ziglio fziglio at kemper.freedesktop.org
Fri Feb 19 09:52:17 UTC 2016


 server/agent-msg-filter.c |    5 ++---
 server/agent-msg-filter.h |    3 +--
 server/reds.c             |   18 ++++++------------
 3 files changed, 9 insertions(+), 17 deletions(-)

New commits:
commit a1e62fa5ae983b7b69cb437b2635ce84b2471383
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Wed Feb 17 21:36:33 2016 +0000

    fix regression due to callback called earlier
    
    Patch 1f210080609f2c00b4d1859eb0b363a38838e7d3 ("Remove use of global
    'reds' from AgentMsgFilter") introduced a regression. This because
    QXLInterface->client_monitors_config was called before returning
    from spice_add_interface. Some client of spice-server expect the
    spice_add_interface already returned and some state change was done
    before client_monitors_config was called.
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Pavel Grunt <pgrunt at redhat.com>

diff --git a/server/agent-msg-filter.c b/server/agent-msg-filter.c
index 14d5100..d72a3e4 100644
--- a/server/agent-msg-filter.c
+++ b/server/agent-msg-filter.c
@@ -29,17 +29,16 @@
 
 void agent_msg_filter_init(struct AgentMsgFilter *filter,
                            gboolean copy_paste, gboolean file_xfer,
-                           gboolean use_client_monitors_config,
                            int discard_all)
 {
     memset(filter, 0, sizeof(*filter));
     filter->copy_paste_enabled = copy_paste;
     filter->file_xfer_enabled = file_xfer;
-    filter->use_client_monitors_config = use_client_monitors_config;
     filter->discard_all = discard_all;
 }
 
 int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
+                                  RedsState *reds,
                                   uint8_t *data, uint32_t len)
 {
     struct VDAgentMessage msg_header;
@@ -96,7 +95,7 @@ data_to_read:
             }
             break;
         case VD_AGENT_MONITORS_CONFIG:
-            if (filter->use_client_monitors_config) {
+            if (reds_use_client_monitors_config(reds)) {
                 filter->result = AGENT_MSG_FILTER_MONITORS_CONFIG;
             } else {
                 filter->result = AGENT_MSG_FILTER_OK;
diff --git a/server/agent-msg-filter.h b/server/agent-msg-filter.h
index c04face..a4fc4cf 100644
--- a/server/agent-msg-filter.h
+++ b/server/agent-msg-filter.h
@@ -37,15 +37,14 @@ typedef struct AgentMsgFilter {
     int result;
     gboolean copy_paste_enabled;
     gboolean file_xfer_enabled;
-    gboolean use_client_monitors_config;
     gboolean discard_all;
 } AgentMsgFilter;
 
 void agent_msg_filter_init(struct AgentMsgFilter *filter,
                            gboolean copy_paste, gboolean file_xfer,
-                           gboolean use_client_monitors_config,
                            gboolean discard_all);
 int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
+                                  SpiceServer *reds,
                                   uint8_t *data, uint32_t len);
 
 #endif
diff --git a/server/reds.c b/server/reds.c
index 5fb5825..b917f26 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -407,8 +407,7 @@ static void reds_reset_vdp(RedsState *reds)
     }
     /* Reset read filter to start with clean state when the agent reconnects */
     agent_msg_filter_init(&state->read_filter, reds->agent_copypaste,
-                          reds->agent_file_xfer,
-                          reds_use_client_monitors_config(reds), TRUE);
+                          reds->agent_file_xfer, TRUE);
     /* Throw away pending chunks from the current (if any) and future
      * messages written by the client.
      * TODO: client should clear its agent messages queue when the agent
@@ -522,8 +521,7 @@ void reds_client_disconnect(RedsState *reds, RedClient *client)
 
         /* Reset write filter to start with clean state on client reconnect */
         agent_msg_filter_init(&reds->agent_state.write_filter, reds->agent_copypaste,
-                              reds->agent_file_xfer,
-                              reds_use_client_monitors_config(reds), TRUE);
+                              reds->agent_file_xfer, TRUE);
 
         /* Throw away pending chunks from the current (if any) and future
          *  messages read from the agent */
@@ -639,7 +637,7 @@ static int vdi_port_read_buf_process(RedsState *reds, VDIReadBuf *buf)
 
     switch (state->vdi_chunk_header.port) {
     case VDP_CLIENT_PORT: {
-        res = agent_msg_filter_process_data(&state->read_filter,
+        res = agent_msg_filter_process_data(&state->read_filter, reds,
                                             buf->data, buf->len);
         switch (res) {
         case AGENT_MSG_FILTER_OK:
@@ -1049,7 +1047,7 @@ void reds_on_main_agent_data(RedsState *reds, MainChannelClient *mcc, void *mess
     VDIChunkHeader *header;
     int res;
 
-    res = agent_msg_filter_process_data(&reds->agent_state.write_filter,
+    res = agent_msg_filter_process_data(&reds->agent_state.write_filter, reds,
                                         message, size);
     switch (res) {
     case AGENT_MSG_FILTER_OK:
@@ -3214,8 +3212,6 @@ SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *s,
         red_dispatcher_init(qxl);
         dispatcher = qxl->st->dispatcher;
         reds->dispatchers = g_list_prepend(reds->dispatchers, dispatcher);
-        reds->agent_state.write_filter.use_client_monitors_config = reds_use_client_monitors_config(reds);
-        reds->agent_state.read_filter.use_client_monitors_config = reds_use_client_monitors_config(reds);
 
         /* this function has to be called after the dispatcher is on the list
          * as QXLInstance clients expect the dispatcher to be on the list when
@@ -3321,11 +3317,9 @@ static void reds_init_vd_agent_resources(RedsState *reds)
 
     ring_init(&state->read_bufs);
     agent_msg_filter_init(&state->write_filter, reds->agent_copypaste,
-                          reds->agent_file_xfer,
-                          reds_use_client_monitors_config(reds), TRUE);
+                          reds->agent_file_xfer, TRUE);
     agent_msg_filter_init(&state->read_filter, reds->agent_copypaste,
-                          reds->agent_file_xfer,
-                          reds_use_client_monitors_config(reds), TRUE);
+                          reds->agent_file_xfer, TRUE);
 
     state->read_state = VDI_PORT_READ_STATE_READ_HEADER;
     state->receive_pos = (uint8_t *)&state->vdi_chunk_header;


More information about the Spice-commits mailing list