aboutsummaryrefslogtreecommitdiff
path: root/xwayland/selection.c
diff options
context:
space:
mode:
Diffstat (limited to 'xwayland/selection.c')
-rw-r--r--xwayland/selection.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/xwayland/selection.c b/xwayland/selection.c
index 0d7f1588..00e45182 100644
--- a/xwayland/selection.c
+++ b/xwayland/selection.c
@@ -55,6 +55,10 @@ static int xwm_read_data_source(int fd, uint32_t mask, void *data) {
int current = selection->source_data.size;
if (selection->source_data.size < incr_chunk_size) {
p = wl_array_add(&selection->source_data, incr_chunk_size);
+ if (!p){
+ wlr_log(L_ERROR, "Could not allocate selection source_data");
+ goto error_out;
+ }
} else {
p = (char *) selection->source_data.data + selection->source_data.size;
}
@@ -64,11 +68,7 @@ static int xwm_read_data_source(int fd, uint32_t mask, void *data) {
int len = read(fd, p, available);
if (len == -1) {
wlr_log(L_ERROR, "read error from data source: %m");
- xwm_selection_send_notify(selection, XCB_ATOM_NONE);
- wl_event_source_remove(selection->property_source);
- selection->property_source = NULL;
- close(fd);
- wl_array_release(&selection->source_data);
+ goto error_out;
}
wlr_log(L_DEBUG, "read %d (available %d, mask 0x%x) bytes: \"%.*s\"",
@@ -140,6 +140,14 @@ static int xwm_read_data_source(int fd, uint32_t mask, void *data) {
}
return 1;
+
+error_out:
+ xwm_selection_send_notify(selection, XCB_ATOM_NONE);
+ wl_event_source_remove(selection->property_source);
+ selection->property_source = NULL;
+ close(fd);
+ wl_array_release(&selection->source_data);
+ return 0;
}
static void xwm_selection_source_send(struct wlr_xwm_selection *selection,