summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2015-11-03 11:08:57 +0100
committerOndrej Zajicek (work) <santiago@crfreenet.org>2015-11-03 11:08:57 +0100
commit338f85ca7721fac16394ccabd561ddb5ccaacb36 (patch)
tree3605719584a69fff364bb7d3d72d1a93f52f6e80
parentacb04cfdc550697a7171a86ca559fd8c52841acb (diff)
IO: Handle fd values too big for select()
If the number of sockets is too much for select(), we should at least handle it with proper error messages and reject new sockets instead of breaking the event loop. Thanks to Alexander V. Chernikov for the patch.
-rw-r--r--sysdep/unix/io.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index 0724667d..726f1e49 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -1309,6 +1309,16 @@ sk_passive_connected(sock *s, int type)
return 0;
}
+ if (fd >= FD_SETSIZE)
+ {
+ /* FIXME: Call err_hook instead ? */
+ log(L_ERR "SOCK: Incoming connection from %I%J (port %d) %s",
+ t->daddr, ipa_is_link_local(t->daddr) ? t->iface : NULL,
+ t->dport, "rejected due to FD_SETSIZE limit");
+ close(fd);
+ return 1;
+ }
+
sock *t = sk_new(s->pool);
t->type = type;
t->fd = fd;
@@ -1404,6 +1414,9 @@ sk_open(sock *s)
if (fd < 0)
ERR("socket");
+ if (fd >= FD_SETSIZE)
+ ERR2("FD_SETSIZE limit reached");
+
s->af = af;
s->fd = fd;