aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2014-02-06 16:29:08 -0500
committerNick Mathewson <nickm@torproject.org>2014-02-06 16:29:08 -0500
commitb4e8d8dc0e6f942346895a5cff123db3aa1f94d5 (patch)
treed8f402e649f694a36ca953a440dece1124325b04
parent9e2de8cecc97a9bc6d346d309a1bd6a800a34751 (diff)
parenta2754d418dffb6188717d5e84d9bea59a2c9853b (diff)
downloadtor-b4e8d8dc0e6f942346895a5cff123db3aa1f94d5.tar
tor-b4e8d8dc0e6f942346895a5cff123db3aa1f94d5.tar.gz
Merge remote-tracking branch 'public/bug9716_024' into maint-0.2.4
-rw-r--r--changes/bug97164
-rw-r--r--src/or/connection.c23
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);