diff --git a/include/xwayland/selection.h b/include/xwayland/selection.h index 43d59054..8b171e1e 100644 --- a/include/xwayland/selection.h +++ b/include/xwayland/selection.h @@ -47,6 +47,7 @@ void xwm_selection_transfer_close_wl_client_fd( struct wlr_xwm_selection_transfer *transfer); void xwm_selection_transfer_destroy_property_reply( struct wlr_xwm_selection_transfer *transfer); +void xwm_selection_transfer_init(struct wlr_xwm_selection_transfer *transfer); void xwm_selection_transfer_finish(struct wlr_xwm_selection_transfer *transfer); bool xwm_selection_transfer_get_selection_property( struct wlr_xwm_selection_transfer *transfer, bool delete); diff --git a/xwayland/selection/incoming.c b/xwayland/selection/incoming.c index e41d1287..183d5f88 100644 --- a/xwayland/selection/incoming.c +++ b/xwayland/selection/incoming.c @@ -155,7 +155,7 @@ static void source_send(struct wlr_xwm_selection *selection, // lose track of the current `transfer->wl_client_fd` and use-after-free // during cleanup. This doesn't happen often, but bail now to avoid a // compositor crash later. - if (transfer->wl_client_fd > 0) { + if (transfer->wl_client_fd >= 0) { wlr_log(WLR_ERROR, "source_send fd %d, but %d already in progress", fd, transfer->wl_client_fd); if (transfer->wl_client_fd != fd) { @@ -404,7 +404,7 @@ void xwm_handle_selection_notify(struct wlr_xwm *xwm, wlr_log(WLR_DEBUG, "denying write access to clipboard: " "no xwayland surface focused"); // Would leak this transfer otherwise. Should never happen. - assert(selection->incoming.wl_client_fd <= 0); + assert(selection->incoming.wl_client_fd < 0); return; } diff --git a/xwayland/selection/outgoing.c b/xwayland/selection/outgoing.c index 1e490adb..8074e3a7 100644 --- a/xwayland/selection/outgoing.c +++ b/xwayland/selection/outgoing.c @@ -297,6 +297,7 @@ static bool xwm_selection_send_data(struct wlr_xwm_selection *selection, return false; } + xwm_selection_transfer_init(transfer); transfer->selection = selection; transfer->request = *req; wl_array_init(&transfer->source_data); diff --git a/xwayland/selection/selection.c b/xwayland/selection/selection.c index 64c957b7..08d04178 100644 --- a/xwayland/selection/selection.c +++ b/xwayland/selection/selection.c @@ -32,6 +32,10 @@ void xwm_selection_transfer_destroy_property_reply( transfer->property_reply = NULL; } +void xwm_selection_transfer_init(struct wlr_xwm_selection_transfer *transfer) { + transfer->wl_client_fd = -1; +} + void xwm_selection_transfer_finish( struct wlr_xwm_selection_transfer *transfer) { transfer->incr = false; @@ -182,6 +186,7 @@ static void selection_init(struct wlr_xwm *xwm, selection->window = xwm->selection_window; selection->incoming.selection = selection; wl_list_init(&selection->outgoing); + xwm_selection_transfer_init(&selection->incoming); uint32_t mask = XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER |