summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2013-09-25 10:39:12 +0100
committerKristian Høgsberg <krh@bitplanet.net>2013-09-25 10:11:20 -0700
commit799ea7206b3af987e5aae7d47f86643edbbb014d (patch)
tree5fd6143de821e083613e5682793d152693f4ada0
parent4125367f20d70cdf3c14f1bcafbf46e1c6e20835 (diff)
client: Fix handling display->reader_count if poll fails
In wl_display_dispatch_queue, if poll fails then it would previously return immediately and leak a reference in display->reader_count. Then if the application ignores the error and tries to read again it will block forever. This can happen for example if the poll fails with EINTR which the application might consider to be a recoverable error. This patch makes it cancel the read so the reader_count will be decremented when poll fails.
-rw-r--r--src/wayland-client.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/wayland-client.c b/src/wayland-client.c
index d043459..e92317a 100644
--- a/src/wayland-client.c
+++ b/src/wayland-client.c
@@ -1210,8 +1210,10 @@ wl_display_dispatch_queue(struct wl_display *display,
pfd[0].fd = display->fd;
pfd[0].events = POLLIN;
- if (poll(pfd, 1, -1) == -1)
+ if (poll(pfd, 1, -1) == -1) {
+ wl_display_cancel_read(display);
return -1;
+ }
pthread_mutex_lock(&display->mutex);