--- src/limits.c Mon Oct 28 07:53:13 2019 -0600 +++ src/limits.c Tue Oct 29 08:27:31 2019 -0600 @@ -37,11 +37,17 @@ #ifdef __linux__ # include <sys/prctl.h> #endif +#include <limits.h> #include "sudo.h" +#ifndef OPEN_MAX +# define OPEN_MAX 256 +#endif + static struct saved_limit { int resource; + rlim_t fallback; bool saved; struct rlimit limit; } saved_limits[] = { @@ -51,7 +57,7 @@ { RLIMIT_CPU }, { RLIMIT_DATA }, { RLIMIT_FSIZE }, - { RLIMIT_NOFILE }, + { RLIMIT_NOFILE, OPEN_MAX }, #ifdef RLIMIT_NPROC { RLIMIT_NPROC }, #endif @@ -162,6 +168,7 @@ { struct rlimit inf = { RLIM_INFINITY, RLIM_INFINITY }; unsigned int idx; + int rc; debug_decl(unlimit_sudo, SUDO_DEBUG_UTIL) /* Set resource limits to unlimited and stash the old values. */ @@ -172,9 +179,19 @@ lim->saved = true; if (setrlimit(lim->resource, &inf) == -1) { struct rlimit rl = lim->limit; - rl.rlim_cur = rl.rlim_max; - if (setrlimit(lim->resource, &rl) == -1) - sudo_warn("setrlimit(%d)", lim->resource); + rl.rlim_cur = MAX(rl.rlim_max, lim->fallback); + if ((rc = setrlimit(lim->resource, &rl)) == -1) { + if (lim->fallback != 0) { + /* macOS won't set rlim_cur to RLIM_INFINITY for NOFILE */ + rc = 0; + if (lim->fallback > lim->limit.rlim_cur) { + rl.rlim_cur = lim->fallback; + rc = setrlimit(lim->resource, &rl); + } + } + if (rc == -1) + sudo_warn("setrlimit(%d)", lim->resource); + } } }