Commit 79798a23 authored by David Goulet's avatar David Goulet
Browse files

Set the open file limit to the current value before changing it



If setrlimit() failed, max_out wasn't set in set_max_file_descriptors()
ending in a state where we don't use ULIMIT_BUFFER for things like tor
private key files.

Also fix the set_max_file_descriptors() documentation.

Fixes #16274

Signed-off-by: default avatarDavid Goulet <dgoulet@ev0ke.net>
parent 9338847b
Loading
Loading
Loading
Loading

changes/bug16274

0 → 100644
+5 −0
Original line number Diff line number Diff line
  o Minor bugfix (open file limit):
    - Fix set_max_file_descriptors() to set by default the max open file
      limit to the current limit in case setrlimit() fails so we at least
      have a usable value; Fixes #16274; bugfix on tor-0.2.0.10-alpha~71;
      Patch by dgoulet.
+16 −8
Original line number Diff line number Diff line
@@ -1600,15 +1600,23 @@ get_max_sockets(void)
 * tell Tor it's allowed to use. */
#define ULIMIT_BUFFER 32 /* keep 32 extra fd's beyond ConnLimit_ */

/** Learn the maximum allowed number of file descriptors, and tell the system
 * we want to use up to that number. (Some systems have a low soft limit, and
 * let us set it higher.)
/** Learn the maximum allowed number of file descriptors, and tell the
 * system we want to use up to that number. (Some systems have a low soft
 * limit, and let us set it higher.)  We compute this by finding the largest
 * number that we can use.
 *
 * We compute this by finding the largest number that we can use.
 * If we can't find a number greater than or equal to <b>limit</b>,
 * then we fail: return -1.
 * If the limit is below the reserved file descriptor value (ULIMIT_BUFFER),
 * return -1 and <b>max_out</b> is untouched.
 *
 * Otherwise, return 0 and store the maximum we found inside <b>max_out</b>.*/
 * If we can't find a number greater than or equal to <b>limit</b>, then we
 * fail by returning -1 and <b>max_out</b> is untouched.
 *
 * If we are unable to set the limit value because of setrlimit() failing,
 * return -1 and <b>max_out</b> is set to the current maximum value returned
 * by getrlimit().
 *
 * Otherwise, return 0 and store the maximum we found inside <b>max_out</b>
 * and set <b>max_sockets</b> with that value as well.*/
int
set_max_file_descriptors(rlim_t limit, int *max_out)
{
@@ -1665,7 +1673,7 @@ set_max_file_descriptors(rlim_t limit, int *max_out)
  }
  /* Set the current limit value so if the attempt to set the limit to the
   * max fails at least we'll have a valid value of maximum sockets. */
  max_sockets = (int)rlim.rlim_cur - ULIMIT_BUFFER;
  *max_out = max_sockets = (int)rlim.rlim_cur - ULIMIT_BUFFER;
  rlim.rlim_cur = rlim.rlim_max;

  if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) {