summaryrefslogtreecommitdiff
path: root/sysdep/unix/io.c
diff options
context:
space:
mode:
authorJan Moskyto Matejka <mq@ucw.cz>2016-03-15 14:57:49 +0100
committerJan Moskyto Matejka <mq@ucw.cz>2016-03-15 14:57:49 +0100
commitfd926ed4eea319b94bd0e09e093b90846bcb169b (patch)
treeb0d526922ffd2cb4c819e74a26ce5188e54293e5 /sysdep/unix/io.c
parente1c13a5a7b86f2ba09178300bad960224658c833 (diff)
Poll: Prevent the improbable case of EAGAIN after POLLIN
Diffstat (limited to 'sysdep/unix/io.c')
-rw-r--r--sysdep/unix/io.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index bc212de1..b769de58 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -1760,7 +1760,7 @@ sk_send_full(sock *s, unsigned len, struct iface *ifa,
/* sk_read() and sk_write() are called from BFD's event loop */
int
-sk_read(sock *s)
+sk_read(sock *s, int revents)
{
switch (s->type)
{
@@ -1779,6 +1779,11 @@ sk_read(sock *s)
{
if (errno != EINTR && errno != EAGAIN)
s->err_hook(s, errno);
+ else if (errno == EAGAIN && !(revents & POLLIN))
+ {
+ log(L_ERR "Got EAGAIN from read when revents=%x (without POLLIN)", revents);
+ s->err_hook(s, 0);
+ }
}
else if (!c)
s->err_hook(s, 0);
@@ -2159,7 +2164,7 @@ io_loop(void)
{
steps--;
io_log_event(s->rx_hook, s->data);
- e = sk_read(s);
+ e = sk_read(s, pfd[s->index].revents);
if (s != current_sock)
goto next;
}
@@ -2203,7 +2208,7 @@ io_loop(void)
{
count++;
io_log_event(s->rx_hook, s->data);
- sk_read(s);
+ sk_read(s, pfd[s->index].revents);
if (s != current_sock)
goto next2;
}