]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
IO: Handle fd values too big for select()
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 3 Nov 2015 10:08:57 +0000 (11:08 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 3 Nov 2015 10:08:57 +0000 (11:08 +0100)
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.

sysdep/unix/io.c

index 0724667d18cdaeb5099bff18c468ad3dc1171c2b..726f1e49e2e0bf573c990d6791da99bfc6c333c5 100644 (file)
@@ -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;