diff --git a/client/displayservers/Wayland/clipboard.c b/client/displayservers/Wayland/clipboard.c index 4b1330f3..ea777a21 100644 --- a/client/displayservers/Wayland/clipboard.c +++ b/client/displayservers/Wayland/clipboard.c @@ -563,6 +563,9 @@ static const struct wl_data_source_listener dataSourceListener = { static void waylandCBReplyFn(void * opaque, LG_ClipboardData type, uint8_t * data, uint32_t size) { + if (type == LG_CLIPBOARD_DATA_NONE) + return; + struct WCBTransfer * transfer = malloc(sizeof(*transfer)); if (!transfer) { diff --git a/client/displayservers/X11/clipboard.c b/client/displayservers/X11/clipboard.c index 068b830d..fb411824 100644 --- a/client/displayservers/X11/clipboard.c +++ b/client/displayservers/X11/clipboard.c @@ -135,15 +135,18 @@ static void x11CBReplyFn(void * opaque, LG_ClipboardData type, { XEvent *s = (XEvent *)opaque; - XChangeProperty( - x11.display , - s->xselection.requestor, - s->xselection.property , - s->xselection.target , - 8, - PropModeReplace, - data, - size); + if (type == LG_CLIPBOARD_DATA_NONE) + s->xselection.property = None; + else + XChangeProperty( + x11.display , + s->xselection.requestor, + s->xselection.property , + s->xselection.target , + 8, + PropModeReplace, + data, + size); XSendEvent(x11.display, s->xselection.requestor, 0, 0, s); XFlush(x11.display); diff --git a/client/src/clipboard.c b/client/src/clipboard.c index 4477a6bc..9a747bbe 100644 --- a/client/src/clipboard.c +++ b/client/src/clipboard.c @@ -71,6 +71,21 @@ void cb_spiceData(const PSDataType type, uint8_t * buffer, uint32_t size) if (!g_params.clipboardToLocal) return; + struct CBRequest * cbr; + if (!ll_shift(g_state.cbRequestList, (void **)&cbr)) + { + DEBUG_ERROR("Received unsolicited SPICE clipboard data"); + return; + } + + if (type != cbr->type || (size && !buffer)) + { + DEBUG_ERROR("Invalid SPICE clipboard response"); + cbr->replyFn(cbr->opaque, LG_CLIPBOARD_DATA_NONE, NULL, 0); + free(cbr); + return; + } + if (type == SPICE_DATA_TEXT) { // dos2unix @@ -89,12 +104,8 @@ void cb_spiceData(const PSDataType type, uint8_t * buffer, uint32_t size) size = newSize; } - struct CBRequest * cbr; - if (ll_shift(g_state.cbRequestList, (void **)&cbr)) - { - cbr->replyFn(cbr->opaque, cb_spiceTypeToLGType(type), buffer, size); - free(cbr); - } + cbr->replyFn(cbr->opaque, cb_spiceTypeToLGType(type), buffer, size); + free(cbr); } void cb_spiceRelease(void)