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

Submitted by Philip Withnall on Nov. 1, 2014, 5:06 p.m.

Details

Message ID 1414861589.2217.26.camel@philip-laptop
State Accepted
Headers show

Not browsing as part of any series.

Commit Message

Philip Withnall Nov. 1, 2014, 5:06 p.m.
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(-)

Patch hide | download patch | download mbox

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;
 		}

Comments

On Sat, 01 Nov 2014 17:06:29 +0000
Philip Withnall <philip@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