aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTudor Brindus <me@tbrindus.ca>2021-01-25 20:07:52 -0500
committerSimon Ser <contact@emersion.fr>2021-01-29 10:18:03 +0100
commit10a2d57055c1a30130da1530243d391861f004f3 (patch)
tree237ce2c0d40b8d4cd25be30b9f6c15176640fb77
parent40b2e7669a39a4371cd9761face9ca70f083e5c6 (diff)
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`.
-rw-r--r--xwayland/selection/incoming.c9
1 files 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,