summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-09-11 16:29:10 -0400
committerNick Mathewson <nickm@torproject.org>2017-09-11 16:29:10 -0400
commitc3debdfe6cef2382d4807a3f9292dd7bd87965a5 (patch)
treea84d647565dcdcda8c14658bf67c8eee6341bed2
parent3a7e2ce1b68fcd69fd2eb4d5cde1f153885f799f (diff)
parentc894e9d3d44bceaf209a9b73c2c43911af3eb1a8 (diff)
downloadtor-c3debdfe6cef2382d4807a3f9292dd7bd87965a5.tar.gz
tor-c3debdfe6cef2382d4807a3f9292dd7bd87965a5.zip
Merge branch 'maint-0.3.0' into release-0.3.0
-rw-r--r--changes/bug227974
-rw-r--r--src/common/compat.c19
2 files changed, 16 insertions, 7 deletions
diff --git a/changes/bug22797 b/changes/bug22797
new file mode 100644
index 0000000000..619baaa409
--- /dev/null
+++ b/changes/bug22797
@@ -0,0 +1,4 @@
+ o Minor bugfixes (file limits):
+ - 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.
diff --git a/src/common/compat.c b/src/common/compat.c
index 4b8b73b4fc..7ec7030ecc 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -1732,19 +1732,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 < (uint64_t) 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;
}