diff options
author | Nick Mathewson <nickm@torproject.org> | 2014-02-06 16:29:08 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2014-02-06 16:29:08 -0500 |
commit | b4e8d8dc0e6f942346895a5cff123db3aa1f94d5 (patch) | |
tree | d8f402e649f694a36ca953a440dece1124325b04 | |
parent | 9e2de8cecc97a9bc6d346d309a1bd6a800a34751 (diff) | |
parent | a2754d418dffb6188717d5e84d9bea59a2c9853b (diff) | |
download | tor-b4e8d8dc0e6f942346895a5cff123db3aa1f94d5.tar tor-b4e8d8dc0e6f942346895a5cff123db3aa1f94d5.tar.gz |
Merge remote-tracking branch 'public/bug9716_024' into maint-0.2.4
-rw-r--r-- | changes/bug9716 | 4 | ||||
-rw-r--r-- | src/or/connection.c | 23 |
2 files changed, 26 insertions, 1 deletions
diff --git a/changes/bug9716 b/changes/bug9716 new file mode 100644 index 000000000..5e3907717 --- /dev/null +++ b/changes/bug9716 @@ -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. diff --git a/src/or/connection.c b/src/or/connection.c index 78cc31e89..062c97114 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -926,6 +926,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>. * @@ -1009,7 +1030,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))); tor_close_socket(s); |