diff options
| author | Dominique Martinet <asmadeus@codewreck.org> | 2017-12-28 12:17:57 +0100 | 
|---|---|---|
| committer | Dominique Martinet <asmadeus@codewreck.org> | 2017-12-28 12:17:57 +0100 | 
| commit | e5dd98c7f54241cb5eb15ba16ef6cb276d24271a (patch) | |
| tree | b1e6f9fd7c7628de6c1165772ed81ffc9e79d2d9 /xwayland | |
| parent | 3eb4fa15ee4c9297cc77ce69fcfcd5d7192462f4 (diff) | |
| download | wlroots-e5dd98c7f54241cb5eb15ba16ef6cb276d24271a.tar.xz | |
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
Diffstat (limited to 'xwayland')
| -rw-r--r-- | xwayland/selection.c | 23 | 
1 files changed, 11 insertions, 12 deletions
diff --git a/xwayland/selection.c b/xwayland/selection.c index 280df583..00e45182 100644 --- a/xwayland/selection.c +++ b/xwayland/selection.c @@ -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) {  		p = wl_array_add(&selection->source_data, incr_chunk_size);  		if (!p){ -			wlr_log(L_ERROR, "Could not allocate selection source_data to read into, throwing away some input"); -			/* if we just return now, we'll just be called -			 * again right away - force read something. -			 * 1K on stack is probably fine? */ -			char junk[1024]; -			read(fd, junk, sizeof(junk)); -			return 1; +			wlr_log(L_ERROR, "Could not allocate selection source_data"); +			goto error_out;  		}  	} else {  		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);  	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\"", @@ -149,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,  | 
