summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-09-11 16:28:59 -0400
committerNick Mathewson <nickm@torproject.org>2017-09-11 16:28:59 -0400
commita25d97e53046132567fd78e82791a2f8cad7b199 (patch)
treed8ccfb6523ac447194e8fe047fe5fd33cbec39cf
parent3cace828a9b42c62a73d1e3b79161a7f68aca40e (diff)
parent878e0d45a5d1469965d456a5d8a436b45ac59c3a (diff)
downloadtor-a25d97e53046132567fd78e82791a2f8cad7b199.tar.gz
tor-a25d97e53046132567fd78e82791a2f8cad7b199.zip
Merge branch 'teor-bug22797-025' into maint-0.2.9
-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 6b12753c95..3ebcfad140 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -1718,19 +1718,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;
}