Merge remote-tracking branch 'public/bug9716_024'

This commit is contained in:
Nick Mathewson
2013-09-19 10:50:34 -04:00
2 changed files with 26 additions and 1 deletions
+4
View File
@@ -0,0 +1,4 @@
o Bugfixes (performance):
- Set the listen() backlog limit to the largest actually supported
on the system, not to the value in a header file. Fixes bug 9716;
bugfix on every released Tor.
+22 -1
View File
@@ -963,6 +963,27 @@ make_socket_reuseable(tor_socket_t sock)
#endif
}
/** Max backlog to pass to listen. We start at */
static int listen_limit = INT_MAX;
/* Listen on <b>fd</b> with appropriate backlog. Return as for listen. */
static int
tor_listen(tor_socket_t fd)
{
int r;
if ((r = listen(fd, listen_limit)) < 0) {
if (listen_limit == SOMAXCONN)
return r;
if ((r = listen(fd, SOMAXCONN)) == 0) {
listen_limit = SOMAXCONN;
log_warn(LD_NET, "Setting listen backlog to INT_MAX connections "
"didn't work, but SOMAXCONN did. Lowering backlog limit.");
}
}
return r;
}
/** Bind a new non-blocking socket listening to the socket described
* by <b>listensockaddr</b>.
*
@@ -1045,7 +1066,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
}
if (is_tcp) {
if (listen(s,SOMAXCONN) < 0) {
if (tor_listen(s) < 0) {
log_warn(LD_NET, "Could not listen on %s:%u: %s", address, usePort,
tor_socket_strerror(tor_socket_errno(s)));
goto err;