From 307e28b4cb08b05bc044482058eeebc9f59bb9a9 Mon Sep 17 00:00:00 2001
From: Kir Kolyshkin <kolyshkin@gmail.com>
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 <kolyshkin@gmail.com>
Upstream-Status: Accepted [https://github.com/rpm-software-management/rpm/pull/444]
Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
---
 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 <sys/personality.h>
 #endif
 #include <sys/utsname.h>
+#include <sys/resource.h>
 
 #include <rpm/rpmlog.h>
 #include <rpm/rpmmacro.h>
@@ -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;
 
