From 95d34f7e5848298cef26d2fcb4701fd1e8418131 Mon Sep 17 00:00:00 2001 From: Lauri Kasanen Date: Tue, 13 Apr 2021 13:49:43 +0300 Subject: [PATCH] Fix some local->remote clipboard merge misses --- common/rfb/SConnection.cxx | 10 +++++++--- common/rfb/SConnection.h | 2 +- common/rfb/VNCSConnectionST.cxx | 3 +-- common/rfb/VNCSConnectionST.h | 2 +- common/rfb/VNCServerST.cxx | 2 +- unix/xserver/hw/vnc/XserverDesktop.cc | 4 ++-- unix/xserver/hw/vnc/XserverDesktop.h | 2 +- unix/xserver/hw/vnc/vncSelection.c | 14 +++++++------- unix/xserver/hw/vnc/vncSelection.h | 2 +- 9 files changed, 22 insertions(+), 19 deletions(-) diff --git a/common/rfb/SConnection.cxx b/common/rfb/SConnection.cxx index 13a62b6..bd1ea45 100644 --- a/common/rfb/SConnection.cxx +++ b/common/rfb/SConnection.cxx @@ -296,8 +296,10 @@ void SConnection::setEncodings(int nEncodings, const rdr::S32* encodings) } } -void SConnection::clientCutText(const char* str) +void SConnection::clientCutText(const char* str, int len) { + hasLocalClipboard = false; + strFree(clientClipboard); clientClipboard = NULL; @@ -328,10 +330,12 @@ void SConnection::handleClipboardNotify(rdr::U32 flags) strFree(clientClipboard); clientClipboard = NULL; - if (flags & rfb::clipboardUTF8) + if (flags & rfb::clipboardUTF8) { handleClipboardAnnounce(true); - else + hasLocalClipboard = false; + } else { handleClipboardAnnounce(false); + } } void SConnection::handleClipboardProvide(rdr::U32 flags, diff --git a/common/rfb/SConnection.h b/common/rfb/SConnection.h index 41039c9..4f8e4c7 100644 --- a/common/rfb/SConnection.h +++ b/common/rfb/SConnection.h @@ -73,7 +73,7 @@ namespace rfb { virtual void setEncodings(int nEncodings, const rdr::S32* encodings); - virtual void clientCutText(const char* str); + virtual void clientCutText(const char* str, int len); virtual void handleClipboardRequest(rdr::U32 flags); virtual void handleClipboardPeek(rdr::U32 flags); diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index e1dae79..0ad5d49 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -1016,7 +1016,7 @@ void VNCSConnectionST::handleClipboardAnnounce(bool available) server->handleClipboardAnnounce(this, available); } -void VNCSConnectionST::handleClipboardData(const char* data) +void VNCSConnectionST::handleClipboardData(const char* data, int len) { if (!(accessRights & AccessCutText)) return; if (!rfb::Server::acceptCutText) return; @@ -1025,7 +1025,6 @@ void VNCSConnectionST::handleClipboardData(const char* data) sock->getPeerAddress()); return; } - int len = strlen(data); const int origlen = len; if (rfb::Server::DLP_ClipAcceptMax && len > rfb::Server::DLP_ClipAcceptMax) len = rfb::Server::DLP_ClipAcceptMax; diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h index 13c5570..1bc6ba5 100644 --- a/common/rfb/VNCSConnectionST.h +++ b/common/rfb/VNCSConnectionST.h @@ -185,7 +185,7 @@ namespace rfb { int x, int y, int w, int h); virtual void handleClipboardRequest(); virtual void handleClipboardAnnounce(bool available); - virtual void handleClipboardData(const char* data); + virtual void handleClipboardData(const char* data, int len); virtual void supportsLocalCursor(); virtual void supportsFence(); virtual void supportsContinuousUpdates(); diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx index 296f3c9..96f970d 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -535,7 +535,7 @@ void VNCServerST::sendClipboardData(const char* data) for (ci = clipboardRequestors.begin(); ci != clipboardRequestors.end(); ci = ci_next) { ci_next = ci; ci_next++; - (*ci)->sendClipboardData(data, strlen(data)); + (*ci)->sendClipboardDataOrClose(data); } clipboardRequestors.clear(); diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 691e3a6..872b2ec 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -476,9 +476,9 @@ void XserverDesktop::handleClipboardAnnounce(bool available) vncHandleClipboardAnnounce(available); } -void XserverDesktop::handleClipboardData(const char* data_) +void XserverDesktop::handleClipboardData(const char* data_, int len) { - vncHandleClipboardData(data_); + vncHandleClipboardData(data_, len); } void XserverDesktop::grabRegion(const rfb::Region& region) diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h index 3e0a298..e35f015 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.h +++ b/unix/xserver/hw/vnc/XserverDesktop.h @@ -96,7 +96,7 @@ public: const rfb::ScreenSet& layout); virtual void handleClipboardRequest(); virtual void handleClipboardAnnounce(bool available); - virtual void handleClipboardData(const char* data); + virtual void handleClipboardData(const char* data, int len); // rfb::PixelBuffer callbacks virtual void grabRegion(const rfb::Region& r); diff --git a/unix/xserver/hw/vnc/vncSelection.c b/unix/xserver/hw/vnc/vncSelection.c index a1af467..21a2a61 100644 --- a/unix/xserver/hw/vnc/vncSelection.c +++ b/unix/xserver/hw/vnc/vncSelection.c @@ -67,7 +67,7 @@ static int vncOwnSelection(Atom selection); static int vncConvertSelection(ClientPtr client, Atom selection, Atom target, Atom property, Window requestor, CARD32 time, - const char* data); + const char* data, int len); static int vncProcConvertSelection(ClientPtr client); static void vncSelectionRequest(Atom selection, Atom target); static int vncProcSendEvent(ClientPtr client); @@ -161,7 +161,7 @@ void vncHandleClipboardAnnounce(int available) } } -void vncHandleClipboardData(const char* data) +void vncHandleClipboardData(const char* data, int len) { struct VncDataTarget* next; @@ -177,7 +177,7 @@ void vncHandleClipboardData(const char* data) vncDataTargetHead->property, vncDataTargetHead->requestor, vncDataTargetHead->time, - data); + data, len); if (rc != Success) { event.u.u.type = SelectionNotify; event.u.selectionNotify.time = vncDataTargetHead->time; @@ -280,7 +280,7 @@ static int vncOwnSelection(Atom selection) static int vncConvertSelection(ClientPtr client, Atom selection, Atom target, Atom property, Window requestor, CARD32 time, - const char* data) + const char* data, int len) { Selection *pSel; WindowPtr pWin; @@ -370,7 +370,7 @@ static int vncConvertSelection(ClientPtr client, Atom selection, rc = dixChangeWindowProperty(serverClient, pWin, realProperty, XA_STRING, 8, PropModeReplace, - strlen(latin1), latin1, TRUE); + len, latin1, TRUE); vncStrFree(latin1); @@ -379,7 +379,7 @@ static int vncConvertSelection(ClientPtr client, Atom selection, } else if (target == xaUTF8_STRING) { rc = dixChangeWindowProperty(serverClient, pWin, realProperty, xaUTF8_STRING, 8, PropModeReplace, - strlen(data), data, TRUE); + len, data, TRUE); if (rc != Success) return rc; } else { @@ -424,7 +424,7 @@ static int vncProcConvertSelection(ClientPtr client) pSel->window == wid) { rc = vncConvertSelection(client, stuff->selection, stuff->target, stuff->property, - stuff->requestor, stuff->time, NULL); + stuff->requestor, stuff->time, NULL, 0); if (rc != Success) { xEvent event; diff --git a/unix/xserver/hw/vnc/vncSelection.h b/unix/xserver/hw/vnc/vncSelection.h index ea52bf2..337f9bf 100644 --- a/unix/xserver/hw/vnc/vncSelection.h +++ b/unix/xserver/hw/vnc/vncSelection.h @@ -26,7 +26,7 @@ void vncSelectionInit(void); void vncHandleClipboardRequest(void); void vncHandleClipboardAnnounce(int available); -void vncHandleClipboardData(const char* data); +void vncHandleClipboardData(const char* data, int len); #ifdef __cplusplus }