summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2010-10-06 16:14:06 +0200
committerHans de Goede <hdegoede@redhat.com>2010-10-06 19:17:08 +0200
commitdddb6ad48ada0ddd5327ee8ab70b87540d5150a5 (patch)
tree5632fb11e9e0840788d31d9a8c99de062427b10d
parent7b84db7a7484b58fdde21029ef374baeaa0a4b51 (diff)
downloadspice-dddb6ad48ada0ddd5327ee8ab70b87540d5150a5.tar.gz
spice-dddb6ad48ada0ddd5327ee8ab70b87540d5150a5.tar.xz
spice-dddb6ad48ada0ddd5327ee8ab70b87540d5150a5.zip
spicec-x11: Remove a race window in selection ownership release code
Well almost remove it, it was possible that another x11 app would acquire selection ownership, and we would receive a release message from the agent before having processed the xselection ownership change event. Then we would set the selection owner to none, overriding the new owner. As the comment in the patch indicates there still is a minute window left where something similar can happen after this patch. Nothing we can do about that (I blame the libX11 selection API).
-rw-r--r--client/x11/platform.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
index 8f0665cb..cb2431fb 100644
--- a/client/x11/platform.cpp
+++ b/client/x11/platform.cpp
@@ -3466,7 +3466,15 @@ void Platform::on_clipboard_release()
{
XEvent event;
+ if (XGetSelectionOwner(x_display, clipboard_prop) != platform_win) {
+ LOG_INFO("Platform::on_clipboard_release() called while not selection owner");
+ return;
+ }
+ /* Note there is a small race window here where another x11 app could
+ acquire selection ownership and we kick it off again, nothing we
+ can do about that :( */
XSetSelectionOwner(x_display, clipboard_prop, None, CurrentTime);
+
/* Make sure we process the XFixesSetSelectionOwnerNotify event caused
by this, so we don't end up changing the clipboard owner to none, after
it has already been re-owned because this event is still pending. */