summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2014-11-01 17:06:29 +0000
committerBryce Harrington <bryce@osg.samsung.com>2015-01-13 16:05:14 -0800
commitca0ee8315779ae2e9c420e3d97fb94f8d21c5cae (patch)
tree3f2d33f2633def5fc38c80456bd3da381651c180 /src
parentevent-loop.c: Use correct OS abstraction function for dupfd() (diff)
downloadwayland-ca0ee8315779ae2e9c420e3d97fb94f8d21c5cae.tar
wayland-ca0ee8315779ae2e9c420e3d97fb94f8d21c5cae.tar.gz
wayland-ca0ee8315779ae2e9c420e3d97fb94f8d21c5cae.tar.bz2
wayland-ca0ee8315779ae2e9c420e3d97fb94f8d21c5cae.tar.lz
wayland-ca0ee8315779ae2e9c420e3d97fb94f8d21c5cae.tar.xz
wayland-ca0ee8315779ae2e9c420e3d97fb94f8d21c5cae.tar.zst
wayland-ca0ee8315779ae2e9c420e3d97fb94f8d21c5cae.zip
wayland-server: Abort if a read from a client gives 0 length
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> Reviewed-by: Marek Chalupa <mchqwerty@gmail.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Diffstat (limited to 'src')
-rw-r--r--src/wayland-server.c2
1 files changed, 1 insertions, 1 deletions
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;
}