]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Always allow extra file descriptors when setting the connection maximum
authorteor <teor2345@gmail.com>
Mon, 3 Jul 2017 05:30:52 +0000 (15:30 +1000)
committerNick Mathewson <nickm@torproject.org>
Wed, 5 Jul 2017 15:15:10 +0000 (11:15 -0400)
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.

changes/bug22797 [new file with mode: 0644]
src/common/compat.c

diff --git a/changes/bug22797 b/changes/bug22797
new file mode 100644 (file)
index 0000000..619baaa
--- /dev/null
@@ -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.
index e25ecc462d713975efcc1fc1f9d5888520a4d1fe..eee52ad34aaae1757f045c1281026c5e3c32a246 100644 (file)
@@ -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;
       }