[Spice-devel] [PATCH spice 1/2] reds: Do not crash when setting agent property

Pavel Grunt pgrunt at redhat.com
Wed Sep 7 07:45:47 UTC 2016


Agent properties like file transfer or copy & paste can be disabled by
calling spice_server_set_agent_{copypaste, file_xfer} before the spice
server is initialized. In that case the call crashes the server because
the agent device is created after the initialization.

To avoid the crash this commit introduce a helper function for setting
the agent properties after the server is initialized.
---
 server/reds.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/server/reds.c b/server/reds.c
index 74f7727..90d04c8 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -730,6 +730,18 @@ static void reds_update_mouse_mode(RedsState *reds)
     }
 }
 
+static void reds_update_agent_properties(RedsState *reds)
+{
+    if (reds->agent_dev == NULL || reds->config == NULL)
+        return;
+    /* copy & paste */
+    reds->agent_dev->priv->write_filter.copy_paste_enabled = reds->config->agent_copypaste;
+    reds->agent_dev->priv->read_filter.copy_paste_enabled = reds->config->agent_copypaste;
+    /* file transfer */
+    reds->agent_dev->priv->write_filter.file_xfer_enabled = reds->config->agent_file_xfer;
+    reds->agent_dev->priv->read_filter.file_xfer_enabled = reds->config->agent_file_xfer;
+}
+
 static void reds_agent_remove(RedsState *reds)
 {
     // TODO: agent is broken with multiple clients. also need to figure out what to do when
@@ -3438,6 +3450,7 @@ static int do_spice_init(RedsState *reds, SpiceCoreInterface *core_interface)
     reds->listen_socket = -1;
     reds->secure_listen_socket = -1;
     reds->agent_dev = red_char_device_vdi_port_new(reds);
+    reds_update_agent_properties(reds);
     ring_init(&reds->clients);
     reds->num_clients = 0;
     reds->main_dispatcher = main_dispatcher_new(reds, reds->core);
@@ -4030,16 +4043,14 @@ SPICE_GNUC_VISIBLE int spice_server_set_agent_mouse(SpiceServer *reds, int enabl
 SPICE_GNUC_VISIBLE int spice_server_set_agent_copypaste(SpiceServer *reds, int enable)
 {
     reds->config->agent_copypaste = enable;
-    reds->agent_dev->priv->write_filter.copy_paste_enabled = reds->config->agent_copypaste;
-    reds->agent_dev->priv->read_filter.copy_paste_enabled = reds->config->agent_copypaste;
+    reds_update_agent_properties(reds);
     return 0;
 }
 
 SPICE_GNUC_VISIBLE int spice_server_set_agent_file_xfer(SpiceServer *reds, int enable)
 {
     reds->config->agent_file_xfer = enable;
-    reds->agent_dev->priv->write_filter.file_xfer_enabled = reds->config->agent_file_xfer;
-    reds->agent_dev->priv->read_filter.file_xfer_enabled = reds->config->agent_file_xfer;
+    reds_update_agent_properties(reds);
     return 0;
 }
 
-- 
2.10.0



More information about the Spice-devel mailing list