[Spice-devel] [vdagent-linux] x11: invalidate requests for targets on grab from client

Victor Toso victortoso at redhat.com
Fri Feb 22 08:42:40 UTC 2019


Hi,

On Thu, Feb 21, 2019 at 09:25:57PM +0100, Jakub Janků wrote:
> If XSetSelectionOwner() is invoked during the time
> we are waiting for the requested clipboard targets,
> the targets we eventually receive are no longer valid.
> 
> To solve this, ignore the same count of target notifications
> as we expected at the time we received grab from the client.

Thanks, seems fine :)

> Otherwise we end up in a situation when vdagent holds
> the clipboard grab in the guest but cannot provide data to the
> apps that request it - this can be observed in the log:
> 
>     clipboard: received selection request event for target *, while not owning client clipboard
> 
> Signed-off-by: Jakub Janků <jjanku at redhat.com>

I'll be testing a little bit more this with previous patch and if
all is good, I'll proposed a release later Today.

> ---
> 
> This addresses the same issue as [0], just in the X11 clipboard implementation.
> 
> [0] https://lists.freedesktop.org/archives/spice-devel/2019-February/048075.html
> 
> ---
>  src/vdagent/x11-priv.h |  1 +
>  src/vdagent/x11.c      | 11 +++++++++++
>  2 files changed, 12 insertions(+)
> 
> diff --git a/src/vdagent/x11-priv.h b/src/vdagent/x11-priv.h
> index e487aa2..99676d2 100644
> --- a/src/vdagent/x11-priv.h
> +++ b/src/vdagent/x11-priv.h
> @@ -92,6 +92,7 @@ struct vdagent_x11 {
>      int xfixes_event_base;
>      int max_prop_size;
>      int expected_targets_notifies[256];
> +    int ignore_targets_notifies[256];
>      int clipboard_owner[256];
>      int clipboard_type_count[256];
>      uint32_t clipboard_agent_types[256][256];
> diff --git a/src/vdagent/x11.c b/src/vdagent/x11.c
> index 484be5e..c2515a8 100644
> --- a/src/vdagent/x11.c
> +++ b/src/vdagent/x11.c
> @@ -945,6 +945,12 @@ static void vdagent_x11_handle_targets_notify(struct vdagent_x11 *x11,
>  
>      x11->expected_targets_notifies[selection]--;
>  
> +    if (x11->ignore_targets_notifies[selection] > 0) {
> +        x11->ignore_targets_notifies[selection]--;
> +        VSELPRINTF("ignoring selection notify TARGETS");
> +        return;
> +    }
> +
>      /* If we have more targets_notifies pending, ignore this one, we
>         are only interested in the targets list of the current owner
>         (which is the last one we've requested a targets list from) */
> @@ -1246,6 +1252,11 @@ void vdagent_x11_clipboard_grab(struct vdagent_x11 *x11, uint8_t selection,
>                         x11->selection_window, CurrentTime);
>      vdagent_x11_set_clipboard_owner(x11, selection, owner_client);
>  
> +    /* If there're pending requests for targets, ignore the returned
> +     * targets as the XSetSelectionOwner() call above made them invalid */
> +    x11->ignore_targets_notifies[selection] =
> +        x11->expected_targets_notifies[selection];
> +

    Acked-by: Victor Toso <victortoso at redhat.com>

Victor

>      /* Flush output buffers and consume any pending events */
>      vdagent_x11_do_read(x11);
>  }
> -- 
> 2.20.1
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20190222/c03dfa6c/attachment.sig>


More information about the Spice-devel mailing list