Skip to content

Commit ea5d664

Browse files
committed
nsjail: increase RLIMIT_NOFILE to min 8192
1 parent e49f75c commit ea5d664

1 file changed

Lines changed: 27 additions & 1 deletion

File tree

nsjail.cc

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <stdlib.h>
3030
#include <string.h>
3131
#include <sys/ioctl.h>
32+
#include <sys/resource.h>
3233
#include <sys/time.h>
3334
#include <termios.h>
3435
#include <unistd.h>
@@ -119,6 +120,29 @@ static bool setTimer(nsj_t* nsj) {
119120
return true;
120121
}
121122

123+
static bool setFDLimit() {
124+
constexpr uint64_t kRLimitNoFileDesired = 8192ULL;
125+
126+
struct rlimit64 rl;
127+
if (util::getrlimit(RLIMIT_NOFILE, &rl) == -1) {
128+
return false;
129+
}
130+
if (rl.rlim_cur >= kRLimitNoFileDesired) {
131+
return true;
132+
}
133+
uint64_t target = std::min((uint64_t)kRLimitNoFileDesired, (uint64_t)rl.rlim_max);
134+
if (target <= rl.rlim_cur) {
135+
return true;
136+
}
137+
rl.rlim_cur = target;
138+
if (util::setrlimit(RLIMIT_NOFILE, rl) == -1) {
139+
PLOG_W("util::setrlimit(RLIMIT_NOFILE, %" PRIu64 ") failed", (uint64_t)rl.rlim_cur);
140+
return false;
141+
}
142+
LOG_D("Increased RLIMIT_NOFILE to %" PRIu64, (uint64_t)rl.rlim_cur);
143+
return true;
144+
}
145+
122146
static bool pipeTraffic(nsj_t* nsj, int listenfd) {
123147
std::vector<struct pollfd> fds;
124148
fds.reserve(nsj->pipes.size() * 3 + 1);
@@ -339,10 +363,12 @@ int main(int argc, char* argv[]) {
339363
if (!nsjail::setSigHandlers()) {
340364
LOG_F("nsjail::setSigHandlers() failed");
341365
}
366+
if (!nsjail::setFDLimit()) {
367+
LOG_E("nsjail::setFDLimit() failed");
368+
}
342369
if (!nsjail::setTimer(nsj.get())) {
343370
LOG_F("nsjail::setTimer() failed");
344371
}
345-
346372
if (nsj->njc.detect_cgroupv2()) {
347373
cgroup2::detectCgroupv2(nsj.get());
348374
LOG_I("Detected cgroups version: %d", nsj->njc.use_cgroupv2() ? 2 : 1);

0 commit comments

Comments
 (0)