mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-24 04:13:28 +01:00
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: David Goulet <dgoulet@ev0ke.net>
This commit is contained in:
parent
9338847bf4
commit
79798a2363
5
changes/bug16274
Normal file
5
changes/bug16274
Normal file
@ -0,0 +1,5 @@
|
||||
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.
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user