From 7b84db7a7484b58fdde21029ef374baeaa0a4b51 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 6 Oct 2010 12:37:05 +0200 Subject: spicec: Move setting of clipboard_owner to guest to platform code Atleast under x11 there is a race condition when setting the clipboard owner to guest from the RedClient code rather then doing it in Platform. After the XSetSelectionOwner() in Platform::on_clipboard_grab(), which runs from the main message loop thread, the x11 event thread can receive a SelectionRequest event from another x11 app, before the RedClient code has set the clipboard owner, which will trigger the owner != guest check in the SelectionRequest event handling code. By moving the setting of the owner in to Platform::on_clipboard_grab() it gets protected by the clipboard lock, which closes this tiny race. --- client/windows/platform.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'client/windows/platform.cpp') diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp index 580a40ae..075d2690 100644 --- a/client/windows/platform.cpp +++ b/client/windows/platform.cpp @@ -859,6 +859,11 @@ void WinPlatform::exit_modal_loop() int Platform::_clipboard_owner = Platform::owner_none; +void Platform::set_clipboard_owner_unlocked(int new_owner) +{ + set_clipboard_owner(new_owner); +} + void Platform::set_clipboard_owner(int new_owner) { if (new_owner == owner_none) { @@ -885,6 +890,8 @@ bool Platform::on_clipboard_grab(uint32_t *types, uint32_t type_count) EmptyClipboard(); SetClipboardData(format, NULL); CloseClipboard(); + + set_clipboard_owner(owner_guest); return true; } -- cgit