diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/main.c | 12 | ||||
-rw-r--r-- | src/core/service.c | 3 |
2 files changed, 12 insertions, 3 deletions
diff --git a/src/core/main.c b/src/core/main.c index bcf9ea5f25..e6ae0bee31 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1162,6 +1162,8 @@ static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching static int bump_rlimit_nofile(struct rlimit *saved_rlimit) { struct rlimit nl; int r; + int min_max; + _cleanup_free_ char *nr_open = NULL; assert(saved_rlimit); @@ -1182,8 +1184,16 @@ static int bump_rlimit_nofile(struct rlimit *saved_rlimit) { arg_default_rlimit[RLIMIT_NOFILE] = rl; } + /* Get current RLIMIT_NOFILE maximum compiled into the kernel. */ + r = read_one_line_file("/proc/sys/fs/nr_open", &nr_open); + if (r == 0) + r = safe_atoi(nr_open, &min_max); + /* If we fail, fallback to the hard-coded kernel limit of 1024 * 1024. */ + if (r < 0) + min_max = 1024 * 1024; + /* Bump up the resource limit for ourselves substantially */ - nl.rlim_cur = nl.rlim_max = 64*1024; + nl.rlim_cur = nl.rlim_max = min_max; r = setrlimit_closest(RLIMIT_NOFILE, &nl); if (r < 0) return log_warning_errno(r, "Setting RLIMIT_NOFILE failed, ignoring: %m"); diff --git a/src/core/service.c b/src/core/service.c index a63c6d8bc3..b45929e535 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -2163,7 +2163,6 @@ static int service_serialize_exec_command(Unit *u, FILE *f, ExecCommand *command unsigned idx; const char *type; char **arg; - _cleanup_strv_free_ char **escaped_args = NULL; _cleanup_free_ char *args = NULL, *p = NULL; size_t allocated = 0, length = 0; @@ -2306,7 +2305,7 @@ static int service_deserialize_exec_command(Unit *u, const char *key, const char bool control, found = false; ServiceExecCommand id = _SERVICE_EXEC_COMMAND_INVALID; ExecCommand *command = NULL; - _cleanup_free_ char *args = NULL, *path = NULL; + _cleanup_free_ char *path = NULL; _cleanup_strv_free_ char **argv = NULL; enum ExecCommandState { |