[PATCH 3/4] wayland-server: Abort if a read from a client gives 0 length

Pekka Paalanen ppaalanen at gmail.com
Wed Nov 5 04:32:29 PST 2014


On Sat, 01 Nov 2014 17:06:29 +0000
Philip Withnall <philip at tecnocode.co.uk> wrote:

> This happens on EOF if using a poll function such as select() or
> kqueue() which doesn’t distinguish EOF events.
> 
> Currently execution should never reach the point where recvmsg() returns
> EOF (len == 0). Instead, epoll() will detect this and indicate EPOLLHUP,
> which is handled a few lines above, closing the connection. However,
> other event mechanisms may not be able to distinguish EOF from regular
> readability (in the case of select()) or inconsistently across platforms
> (in the case of POLLHUP). There is also the possibility of half-closed
> connections (shutdown(), POLLRDHUP), though this may not be an issue
> with Wayland.
> 
> This will not cause problems if the FD polls as readable but actually is
> not — in that case, recvmsg() will return EAGAIN.
> 
> Signed-off-by: Philip Withnall <philip at tecnocode.co.uk>
> Signed-off-by: Karsten Otto <ottoka at posteo.de>
> ---
>  src/wayland-server.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/wayland-server.c b/src/wayland-server.c
> index 674aeca..85741cb 100644
> --- a/src/wayland-server.c
> +++ b/src/wayland-server.c
> @@ -260,7 +260,7 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
>  	len = 0;
>  	if (mask & WL_EVENT_READABLE) {
>  		len = wl_connection_read(connection);
> -		if (len < 0 && errno != EAGAIN) {
> +		if (len == 0 || (len < 0 && errno != EAGAIN)) {
>  			wl_client_destroy(client);
>  			return 1;
>  		}

Pushed.


Thanks,
pq


More information about the wayland-devel mailing list