summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorteor <teor2345@gmail.com>2017-07-03 15:30:52 +1000
committerNick Mathewson <nickm@torproject.org>2017-07-05 11:15:10 -0400
commit878e0d45a5d1469965d456a5d8a436b45ac59c3a (patch)
treebd43842680644fddf69d084577067bcb2d1ab6c8 /src/common
parentccae991662adb3b64bdb1dcd4a942e4d1e163414 (diff)
downloadtor-878e0d45a5d1469965d456a5d8a436b45ac59c3a.tar.gz
tor-878e0d45a5d1469965d456a5d8a436b45ac59c3a.zip
Always allow extra file descriptors when setting the connection maximum
When setting the maximum number of connections allowed by the OS, always allow some extra file descriptors for other files. Fixes bug 22797; bugfix on 0.2.0.10-alpha.
Diffstat (limited to 'src/common')
-rw-r--r--src/common/compat.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/common/compat.c b/src/common/compat.c
index e25ecc462d..eee52ad34a 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -1568,19 +1568,24 @@ set_max_file_descriptors(rlim_t limit, int *max_out)
if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) {
int bad = 1;
#ifdef OPEN_MAX
- if (errno == EINVAL && OPEN_MAX < rlim.rlim_cur) {
+ uint64_t try_limit = OPEN_MAX - ULIMIT_BUFFER;
+ if (errno == EINVAL && try_limit < rlim.rlim_cur) {
/* On some platforms, OPEN_MAX is the real limit, and getrlimit() is
* full of nasty lies. I'm looking at you, OSX 10.5.... */
- rlim.rlim_cur = OPEN_MAX;
+ rlim.rlim_cur = try_limit;
if (setrlimit(RLIMIT_NOFILE, &rlim) == 0) {
if (rlim.rlim_cur < (rlim_t)limit) {
log_warn(LD_CONFIG, "We are limited to %lu file descriptors by "
- "OPEN_MAX, and ConnLimit is %lu. Changing ConnLimit; sorry.",
- (unsigned long)OPEN_MAX, (unsigned long)limit);
+ "OPEN_MAX (%lu), and ConnLimit is %lu. Changing "
+ "ConnLimit; sorry.",
+ (unsigned long)try_limit, (unsigned long)OPEN_MAX,
+ (unsigned long)limit);
} else {
- log_info(LD_CONFIG, "Dropped connection limit to OPEN_MAX (%lu); "
- "Apparently, %lu was too high and rlimit lied to us.",
- (unsigned long)OPEN_MAX, (unsigned long)rlim.rlim_max);
+ log_info(LD_CONFIG, "Dropped connection limit to %lu based on "
+ "OPEN_MAX (%lu); Apparently, %lu was too high and rlimit "
+ "lied to us.",
+ (unsigned long)try_limit, (unsigned long)OPEN_MAX,
+ (unsigned long)rlim.rlim_max);
}
bad = 0;
}