1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
From 1f5438d677dca330642158ec0b1c0366c6a65725 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>
(cherry picked from commit 307e28b4cb08b05bc044482058eeebc9f59bb9a9)
---
rpmio/rpmio.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/rpmio/rpmio.c b/rpmio/rpmio.c
index 8148aa2..0698e53 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>
@@ -1495,7 +1496,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;
--
2.7.4
|