[Spice-devel] [PATCH 3/3] Add VD_AGENT_CAP_MAX_CLIPBOARD support

Marc-André Lureau marcandre.lureau at gmail.com
Thu Nov 14 08:03:19 PST 2013


From: Marc-André Lureau <marcandre.lureau at gmail.com>

Do not send clipboard data bigger than last received
VDAgentMaxClipboard.

There is no need to further limit at the session agent, since it is
already OOM safe, and since marhsalling/sending is local, that shouldn't
make any stability or speed difference that deserves the added
complexity.
---
 src/vdagentd.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/vdagentd.c b/src/vdagentd.c
index 2eb97cb..1098fb6 100644
--- a/src/vdagentd.c
+++ b/src/vdagentd.c
@@ -74,6 +74,7 @@ static int agent_owns_clipboard[256] = { 0, };
 static int quit = 0;
 static int retval = 0;
 static int client_connected = 0;
+static int max_clipboard = -1;
 
 /* utility functions */
 /* vdagentd <-> spice-client communication handling */
@@ -98,6 +99,7 @@ static void send_capabilities(struct vdagent_virtio_port *vport,
     VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_CLIPBOARD_SELECTION);
     VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_SPARSE_MONITORS_CONFIG);
     VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_GUEST_LINEEND_LF);
+    VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_MAX_CLIPBOARD);
 
     vdagent_virtio_port_write(vport, VDP_CLIENT_PORT,
                               VD_AGENT_ANNOUNCE_CAPABILITIES, 0,
@@ -369,6 +371,13 @@ int virtio_port_read_complete(
         vdagent_virtio_port_reset(vport, VDP_CLIENT_PORT);
         do_client_disconnect();
         break;
+    case VD_AGENT_MAX_CLIPBOARD:
+        if (message_header->size != sizeof(VDAgentMaxClipboard))
+            goto size_error;
+        VDAgentMaxClipboard *msg = (VDAgentMaxClipboard *)data;
+        syslog(LOG_DEBUG, "Set max clipboard: %d", msg->max);
+        max_clipboard = msg->max;
+        break;
     default:
         syslog(LOG_WARNING, "unknown message type %d, ignoring",
                message_header->type);
@@ -453,6 +462,12 @@ int do_agent_clipboard(struct udscs_connection *conn,
     case VDAGENTD_CLIPBOARD_DATA:
         msg_type = VD_AGENT_CLIPBOARD;
         data_type = header->arg2;
+        if (max_clipboard != -1 && size > max_clipboard) {
+            syslog(LOG_WARNING, "clipboard is too large (%d > %d), discarding",
+                   size, max_clipboard);
+            virtio_write_clipboard(selection, msg_type, data_type, NULL, 0);
+            return 0;
+        }
         break;
     case VDAGENTD_CLIPBOARD_RELEASE:
         msg_type = VD_AGENT_CLIPBOARD_RELEASE;
-- 
1.8.3.1



More information about the Spice-devel mailing list