From 10a2d57055c1a30130da1530243d391861f004f3 Mon Sep 17 00:00:00 2001 From: Tudor Brindus Date: Mon, 25 Jan 2021 20:07:52 -0500 Subject: [PATCH] xwayland/selection: explicitly bail if first write to Wayland fd fails If `xwm_data_source_write` failed, it's failed permanently. In fact, a failing `xwm_data_source_write` sets `transfer->property_reply` to null as part of its error handling. Instead of relying on an indirect check (whether `transfer->property_reply` is still non-null), explicitly use the return value from `xwm_data_source_write`. --- xwayland/selection/incoming.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/xwayland/selection/incoming.c b/xwayland/selection/incoming.c index 305bc196..1fae0df6 100644 --- a/xwayland/selection/incoming.c +++ b/xwayland/selection/incoming.c @@ -61,9 +61,12 @@ static void xwm_write_property(struct wlr_xwm_selection_transfer *transfer, transfer->property_start = 0; transfer->property_reply = reply; - xwm_data_source_write(transfer->wl_client_fd, WL_EVENT_WRITABLE, transfer); - - if (transfer->property_reply != NULL) { + bool wl_client_finished_consuming = + !xwm_data_source_write(transfer->wl_client_fd, WL_EVENT_WRITABLE, transfer); + if (!wl_client_finished_consuming) { + // Wrote out part of the property to the Wayland client, but the client was + // unable to accept all of it. Schedule an event to asynchronously complete + // the transfer. struct wl_event_loop *loop = wl_display_get_event_loop(xwm->xwayland->wl_display); transfer->event_source = wl_event_loop_add_fd(loop,