[Spice-devel] [spice-gtk v3] gtk-session: always reply to agent's clipboard request

Pavel Grunt pgrunt at redhat.com
Fri Feb 24 14:39:16 UTC 2017


Hi,

On Fri, 2017-02-24 at 14:28 +0100, Victor Toso wrote:
> From: Victor Toso <me at victortoso.com>
> 
> This fixes a regression from 7b0de6217670e0f668aff2949f
> 
> We need to reply back to the agent all clipboard requests even in
> case
> of failure otherwise it will have a pending request. The following
> error message can be seen afterwards, in the linux agent, when
> client
> sends down some clipboard data:
> 
>  > clipboard: selection requests pending on clipboard ownership
>  > change, clearing
> 
> An easy way to reproduce this is:
> 1-) In client, copy image from lo-draw (selection or ctrl+c)
> 2-) In guest, paste it to GEdit (mouse3 our ctrl+v)
> 3-) Move to the client
> 4-) Move back to the guest
> 5-) see error on vdagent logs
> 
> The reason for failure is that client's clipboard contains different
> data type (image) then what was requested from guest's editor (text)
> 
> While at it, include extra debug message as it might be hard to
> identify why clipboard did not work.
> 
> Resolves: rhbz#1409854
> Signed-off-by: Victor Toso <victortoso at redhat.com>
> ---
>  src/spice-gtk-session.c | 21 +++++++++++++--------
>  1 file changed, 13 insertions(+), 8 deletions(-)
> 
> diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c
> index 0426d8f..3be747e 100644
> --- a/src/spice-gtk-session.c
> +++ b/src/spice-gtk-session.c
> @@ -936,35 +936,40 @@ static void
> clipboard_received_text_cb(GtkClipboard *clipboard,
>      char *conv = NULL;
>      int len = 0;
>      int selection;
> +    const gchar *data = NULL;
I would use const guchar *

>  
>      if (self == NULL)
>          return;
>  
> +    selection = get_selection_from_clipboard(self->priv,
> clipboard);
> +    g_return_if_fail(selection != -1);
> +
>      if (text == NULL) {
>          SPICE_DEBUG("Failed to retrieve clipboard text");
> -        return;
> +        goto notify_agent;
>      }
>  
>      g_return_if_fail(SPICE_IS_GTK_SESSION(self));
>  
> -    selection = get_selection_from_clipboard(self->priv,
> clipboard);
> -    g_return_if_fail(selection != -1);
> -
>      len = strlen(text);
>      if (!check_clipboard_size_limits(self, len)) {
> -        return;
> +        SPICE_DEBUG("Failed sized limits of clipboard text (%d 
                               typo
> bytes)", len);
> +        goto notify_agent;
>      }
>  
>      /* gtk+ internal utf8 newline is always LF, even on windows */
>      conv = fixup_clipboard_text(self, text, &len);
>      if (!check_clipboard_size_limits(self, len)) {
> -        g_free(conv);
> -        return;
> +        SPICE_DEBUG("Failed sized limits of clipboard text (%d 
                              typo
> bytes)", len);
> +        goto notify_agent;
>      }
>  
> +    data = (conv != NULL) ? conv : text;
> +notify_agent:
>      spice_main_clipboard_selection_notify(self->priv->main,
> selection,
>                                            VD_AGENT_CLIPBOARD_UTF8_T
> EXT,
> -                                          (guchar *)(conv ?: text),
> len);
> +                                          (guchar *) data,
> +                                          (data != NULL) ? len :
> 0);
>      g_free(conv);
>  }

Besides that Ack,

Pavel

>  


More information about the Spice-devel mailing list