From 307e28b4cb08b05bc044482058eeebc9f59bb9a9 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Tue, 29 May 2018 18:09:27 -0700 Subject: [PATCH 3/3] rpmSetCloseOnExec: use getrlimit() In case /proc is not available to get the actual list of opened fds, we fall back to iterating through the list of all possible fds. It is possible that during the course of the program execution the limit on number of open file descriptors might be lowered, so using the current limit, as returned by sysconf(_SC_OPEN_MAX), might omit some fds. Therefore, it is better to use rlim_max from the structure filled in by gertlimit(RLIMIT_NOFILE) to make sure we're checking all fds. This slows down the function, but only in the case /proc is not available, which should be rare in practice. Signed-off-by: Kir Kolyshkin Upstream-Status: Accepted [https://github.com/rpm-software-management/rpm/pull/444] Signed-off-by: Peter Kjellerstedt --- rpmio/rpmio.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rpmio/rpmio.c b/rpmio/rpmio.c index 55351c221..e051c9863 100644 --- a/rpmio/rpmio.c +++ b/rpmio/rpmio.c @@ -10,6 +10,7 @@ #include #endif #include +#include #include #include @@ -1778,7 +1779,14 @@ void rpmSetCloseOnExec(void) DIR *dir = opendir("/proc/self/fd"); if (dir == NULL) { /* /proc not available */ /* iterate over all possible fds, might be slow */ - int open_max = sysconf(_SC_OPEN_MAX); + struct rlimit rl; + int open_max; + + if (getrlimit(RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY) + open_max = rl.rlim_max; + else + open_max = sysconf(_SC_OPEN_MAX); + if (open_max == -1) open_max = 1024;