Package: ssvnc
Version: 1.0.29-3
Severity: normal

For some time I've noticed my clipboard being corrupted during VNC
sessions between GNU/Linux machines with x11vnc server and ssvncviewer -
clipboard contents would be overwritten or changes would apparently not
be picked up on one or other side on occasion. After discovering and
disabling the PRIMARY mess (...), I found that even with the following
call, clipboard updates from my main machine didn't always reach the
other end:

==========================================================

ssvncviewer -recvtext 'clipboard' -sendclipboard omega3:0

==========================================================

If I copied some text on the ssvncviewer machine and then changed the
selection before I move to the VNC window, the selection (i.e. the
PRIMARY) would end up sent to the other machine's clipboard, even when
expressly told not to (x11vnc is also launched with '-noprimary
-nosetprimary').

vncviewer/selection.c:SelectionFromVNC has logic to detect when
'-sendclipboard' is specified (via sendsel and appData.sendClipboard),
however when '-sendalways' is not used, GetSelectionTimeCallback is called.

When GetSelectionTimeCallback decides a selection change has occurred,
it calls XtGetSelectionValue with the hardcoded XA_PRIMARY selection,
which causes the bug. In the attached patch I have copied the logic from
SelectionToVNC to use the configured selection.

For a user workaround, launch ssvncviewer with '-sendclipboard
-sendalways', as you don't get the extra callback and only one
XtGetSelectionValue fetch is used with the correct selection (but now
every time you hover over the VNC window you spam the other end with
clipboard 'updates').


--- System information. ---
Architecture: amd64
Kernel:       Linux 4.7.0-1-amd64

Devuan Release: stretch/sid
  990 testing         10.1.0.3   500 quodlibet-unstable lazka.github.io
--- Package information. ---
Depends                (Version) | Installed
================================-+-=============
libc6                  (>= 2.14) | libice6             (>= 1:1.0.0) |
libjpeg62-turbo       (>= 1.3.1) | libsm6                           |
libssl1.0.2          (>= 1.0.2d) | libx11-6                         |
libxaw7                          | libxext6                         |
libxmu6                          | libxpm4                          |
libxt6                           | zlib1g              (>= 1:1.1.4) | tk
                              | openssh-client                   |
bind9-host                       |  OR host                         |
procps                           | psmisc                           |
xterm                            | stunnel4                         |
openssl                          |

Recommends         (Version) | Installed
============================-+-===========
default-jre                  | 2:1.8-57
 OR java5-runtime            |

Package's Suggests field is empty.
diff --git a/vnc_unixsrc/vncviewer/selection.c b/vnc_unixsrc/vncviewer/selection.c
index 48b0a98..beb6916 100644
--- a/vnc_unixsrc/vncviewer/selection.c
+++ b/vnc_unixsrc/vncviewer/selection.c
@@ -199,12 +199,18 @@ GetSelectionTimeCallback(Widget w, XtPointer clientData, Atom* selection,
 			 Atom* type, XtPointer value, unsigned long* length,
 			 int* format)
 {
+	Atom sendsel = XA_PRIMARY;
+
+	if (appData.sendClipboard && clipboard_atom != None) {
+		sendsel = clipboard_atom;
+	}
+
 	if (value && *format == 32 && *length == 1) {
 		Time t = *(CARD32 *)value;
 
 		if (TIME_LATER(t, prevSelectionTime)) {
 			prevSelectionTime = t;
-			XtGetSelectionValue(w, XA_PRIMARY, XA_STRING, GetSelectionCallback, NULL, CurrentTime);
+			XtGetSelectionValue(w, sendsel, XA_STRING, GetSelectionCallback, NULL, CurrentTime);
 		}
 	} else if (!getenv("VNCVIEWER_NO_CUTBUFFER")) {
 		if (TIME_LATER(cutBufferTime, prevSelectionTime)) {

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to