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

Marc-André Lureau marcandre.lureau at gmail.com
Mon Jan 6 15:28:22 PST 2014


ping

On Thu, Nov 14, 2013 at 5:03 PM, Marc-André Lureau
<marcandre.lureau at gmail.com> wrote:
> 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
>



-- 
Marc-André Lureau


More information about the Spice-devel mailing list