From: Michael Tremer Date: Fri, 21 May 2021 10:32:28 +0000 (+0000) Subject: libpakfire: Set number of max open files to 512k X-Git-Tag: 0.9.28~1285^2~109 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6582a14311d89c65d23f8215d9cda95e46fee612;p=pakfire.git libpakfire: Set number of max open files to 512k Following this: http://0pointer.net/blog/file-descriptor-limits.html Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/execute.c b/src/libpakfire/execute.c index 143e78bb6..cb806fbd6 100644 --- a/src/libpakfire/execute.c +++ b/src/libpakfire/execute.c @@ -368,8 +368,13 @@ static int pakfire_execute_fork(void* data) { close(env->stderr[0]); } + // Reset open file limit (http://0pointer.net/blog/file-descriptor-limits.html) + int r = pakfire_rlimit_reset_nofile(pakfire); + if (r) + return r; + // exec() command - int r = execvpe(env->argv[0], (char**)env->argv, env->envp); + r = execvpe(env->argv[0], (char**)env->argv, env->envp); if (r < 0) { ERROR(pakfire, "Could not execve(): %s\n", strerror(errno)); } diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index 61573f160..74c4f5f33 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -97,6 +97,13 @@ struct timespec timespec_from_ms(int milliseconds); int timespec_lt(struct timespec* t1, struct timespec* t2); +// Resource Limits + +#define PAKFIRE_RLIMIT_NOFILE_MAX (512 * 1024) + +int pakfire_rlimit_set(Pakfire pakfire, int limit); +int pakfire_rlimit_reset_nofile(Pakfire pakfire); + #endif #endif /* PAKFIRE_UTIL_H */ diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 1045aeb54..2f87d8230 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -849,6 +849,11 @@ PAKFIRE_EXPORT int pakfire_create( if (r && errno != ENOENT) goto ERROR; + // Bump RLIMIT_NOFILE to maximum + r = pakfire_rlimit_set(p, PAKFIRE_RLIMIT_NOFILE_MAX); + if (r) + goto ERROR; + DEBUG(p, "Pakfire initialized at %p\n", p); DEBUG(p, " arch = %s\n", pakfire_get_arch(p)); DEBUG(p, " path = %s\n", pakfire_get_path(p)); diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index 9dd14d6a9..fd29b683b 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -839,3 +840,46 @@ int timespec_lt(struct timespec* t1, struct timespec* t2) { (t1->tv_sec == t2->tv_sec && t1->tv_nsec < t2->tv_nsec) ); } + +// Resource Limits + +int pakfire_rlimit_set(Pakfire pakfire, int limit) { + struct rlimit rl; + + // Sanity check + if (limit < 3) { + errno = EINVAL; + return 1; + } + + // Fetch current configuration + if (getrlimit(RLIMIT_NOFILE, &rl) < 0) { + ERROR(pakfire, "Could not read RLIMIT_NOFILE: %s\n", strerror(errno)); + return 1; + } + + // Do not attempt to set higher than maximum + if ((long unsigned int)limit > rl.rlim_max) + limit = rl.rlim_max; + + rl.rlim_cur = limit; + + // Set the new limit + if (setrlimit(RLIMIT_NOFILE, &rl) < 0) { + ERROR(pakfire, "Could not set RLIMIT_NOFILE to %lu: %s\n", + rl.rlim_cur, strerror(errno)); + return 1; + } + + DEBUG(pakfire, "RLIMIT_NOFILE set to %d\n", limit); + + return 0; +} + +/* + Resets RLIMIT_NOFILE to FD_SETSIZE (e.g. 1024) + for compatibility with software that uses select() +*/ +int pakfire_rlimit_reset_nofile(Pakfire pakfire) { + return pakfire_rlimit_set(pakfire, FD_SETSIZE); +}