xwayland/selection: handle wl_array_add failure better

Just abort and deregister instead of trying to throw some input out,
which would have lead to inconsistent paste
This commit is contained in:
Dominique Martinet 2017-12-28 12:17:57 +01:00
parent 3eb4fa15ee
commit e5dd98c7f5

View file

@ -56,13 +56,8 @@ static int xwm_read_data_source(int fd, uint32_t mask, void *data) {
if (selection->source_data.size < incr_chunk_size) { if (selection->source_data.size < incr_chunk_size) {
p = wl_array_add(&selection->source_data, incr_chunk_size); p = wl_array_add(&selection->source_data, incr_chunk_size);
if (!p){ if (!p){
wlr_log(L_ERROR, "Could not allocate selection source_data to read into, throwing away some input"); wlr_log(L_ERROR, "Could not allocate selection source_data");
/* if we just return now, we'll just be called goto error_out;
* again right away - force read something.
* 1K on stack is probably fine? */
char junk[1024];
read(fd, junk, sizeof(junk));
return 1;
} }
} else { } else {
p = (char *) selection->source_data.data + selection->source_data.size; p = (char *) selection->source_data.data + selection->source_data.size;
@ -73,11 +68,7 @@ static int xwm_read_data_source(int fd, uint32_t mask, void *data) {
int len = read(fd, p, available); int len = read(fd, p, available);
if (len == -1) { if (len == -1) {
wlr_log(L_ERROR, "read error from data source: %m"); wlr_log(L_ERROR, "read error from data source: %m");
xwm_selection_send_notify(selection, XCB_ATOM_NONE); goto error_out;
wl_event_source_remove(selection->property_source);
selection->property_source = NULL;
close(fd);
wl_array_release(&selection->source_data);
} }
wlr_log(L_DEBUG, "read %d (available %d, mask 0x%x) bytes: \"%.*s\"", wlr_log(L_DEBUG, "read %d (available %d, mask 0x%x) bytes: \"%.*s\"",
@ -149,6 +140,14 @@ static int xwm_read_data_source(int fd, uint32_t mask, void *data) {
} }
return 1; 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, static void xwm_selection_source_send(struct wlr_xwm_selection *selection,