--- /dev/null
+ o Minor bugfixes
+ - Control port was using set_max_file_descriptors() with a limit set to
+ 0 to get the max value. A recent fix made this use case return an
+ error and introduced dead code in that function. This triggered a
+ warning that our limit (ConnLimit) was invalid but in reality it was
+ not.
+
+ Now, to the control port uses a specific getter function to query the
+ value and set_max_file_descriptors() should never be used again for
+ that purpose. Fixes #16697; bugfix on 0.2.7.2-alpha.
}
#endif
+/* Return the maximum number of allowed sockets. */
+int
+get_max_sockets(void)
+{
+ return max_sockets;
+}
+
/** Number of extra file descriptors to keep in reserve beyond those that we
* tell Tor it's allowed to use. */
#define ULIMIT_BUFFER 32 /* keep 32 extra fd's beyond ConnLimit_ */
* If we can't find a number greater than or equal to <b>limit</b>,
* then we fail: return -1.
*
- * If <b>limit</b> is 0, then do not adjust the current maximum.
- *
* Otherwise, return 0 and store the maximum we found inside <b>max_out</b>.*/
int
set_max_file_descriptors(rlim_t limit, int *max_out)
strerror(errno));
return -1;
}
- if (limit == 0) {
- /* XXXX DEAD CODE We can't reach this point, since the first "if" in this
- * function increases limit if it started out less than ULIMIT_BUFFER */
-
- /* If limit == 0, return the maximum value without setting it. */
- limit = rlim.rlim_max;
- if (limit > INT_MAX)
- limit = INT_MAX;
- *max_out = max_sockets = (int)limit - ULIMIT_BUFFER;
- return 0;
- }
if (rlim.rlim_max < limit) {
log_warn(LD_CONFIG,"We need %lu file descriptors available, and we're "
"limited to %lu. Please change your ulimit -n.",
#if !defined(HAVE_RLIM_T)
typedef unsigned long rlim_t;
#endif
+int get_max_sockets(void);
int set_max_file_descriptors(rlim_t limit, int *max);
int tor_disable_debugger_attach(void);
int switch_id(const char *user);
}
#endif
} else if (!strcmp(question, "process/descriptor-limit")) {
- int max_fds=-1;
- set_max_file_descriptors(0, &max_fds);
+ int max_fds = get_max_sockets();
tor_asprintf(answer, "%d", max_fds);
} else if (!strcmp(question, "limits/max-mem-in-queues")) {
tor_asprintf(answer, U64_FORMAT,