[Spice-devel] [spice-gtk v2] gtk-session: clipboard request: notify agent on failure
Victor Toso
victortoso at redhat.com
Wed Jan 16 09:10:35 UTC 2019
From: Victor Toso <me at victortoso.com>
Similar to 172c521271a3d - if we don't, the agent might be waiting for
data till some timeout happens in the system, blocking copy-paste
feature and possibly freezing applications.
A way to reproduce is copy-paste big clipboard data between two spice
clients.
Also add some documentation to the checks, in order to quickly
understand what they are about.
Related: https://gitlab.freedesktop.org/spice/win32/vd_agent/issues/6
Related: https://gitlab.freedesktop.org/spice/linux/vd_agent/issues/9
Related: https://bugzilla.redhat.com/show_bug.cgi?id=1594876
v1 -> v2:
- Fixed comment on s->clipboard_by_guest[selection] check (Marc-André)
- Removed the reply on read only. (Marc-André)
Signed-off-by: Victor Toso <victortoso at redhat.com>
---
src/spice-gtk-session.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c
index 1a19bca..82a5b35 100644
--- a/src/spice-gtk-session.c
+++ b/src/spice-gtk-session.c
@@ -1015,12 +1015,29 @@ static gboolean clipboard_request(SpiceMainChannel *main, guint selection,
int m;
cb = get_clipboard_from_selection(s, selection);
- g_return_val_if_fail(cb != NULL, FALSE);
- g_return_val_if_fail(s->clipboard_by_guest[selection] == FALSE, FALSE);
- g_return_val_if_fail(s->clip_grabbed[selection], FALSE);
+ if (cb == NULL) {
+ goto notify_agent;
+ }
+
+ /* As we are holding clipboard data sent by selection-grab from guest, the
+ * selection-request of clipboard data from guest must fail. We either sent
+ * a bad selection-grab to the guest or the agent is buggy. */
+ if (s->clipboard_by_guest[selection]) {
+ SPICE_DEBUG("clipboard: agent request: grab on hold by agent, possible race");
+ goto notify_agent;
+ }
- if (read_only(self))
+ /* The selection-request by agent should happen only if the clipboard data is set
+ * by client */
+ if (!s->clip_grabbed[selection]) {
+ SPICE_DEBUG("clipboard: agent request: data set by agent, possible race");
+ goto notify_agent;
+ }
+
+ /* On read only, should not reply to the agent. */
+ if (read_only(self)) {
return FALSE;
+ }
if (type == VD_AGENT_CLIPBOARD_UTF8_TEXT) {
gtk_clipboard_request_text(cb, clipboard_received_text_cb,
@@ -1039,6 +1056,10 @@ static gboolean clipboard_request(SpiceMainChannel *main, guint selection,
}
return TRUE;
+
+notify_agent:
+ spice_main_channel_clipboard_selection_notify(s->main, selection, type, NULL, 0);
+ return FALSE;
}
static void clipboard_release(SpiceMainChannel *main, guint selection,
--
2.20.1
More information about the Spice-devel
mailing list