summaryrefslogtreecommitdiff
path: root/nix/libutil
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2025-02-11 17:42:37 +0100
committerLudovic Courtès <ludo@gnu.org>2025-03-26 17:57:42 +0100
commitf03e6eff2f491fbf1a38b36d46c0fe2fdd3e6886 (patch)
tree91c7edbe4864fe80d17d7754d7e833dfafb75ef3 /nix/libutil
parent92205bab4dcf25a9c4dbe08daf0e53c6e608ca3e (diff)
daemon: Use ‘close_range’ where available.
* nix/libutil/util.cc (closeMostFDs) [HAVE_CLOSE_RANGE]: Use ‘close_range’ when ‘exceptions’ is empty. * config-daemon.ac: Check for <linux/close_range.h> and the ‘close_range’ symbol. Change-Id: I12fa3bde58b003fcce5ea5a1fee1dcf9a92c0359
Diffstat (limited to 'nix/libutil')
-rw-r--r--nix/libutil/util.cc23
1 files changed, 17 insertions, 6 deletions
diff --git a/nix/libutil/util.cc b/nix/libutil/util.cc
index 3206dea11b1..eb2d16e1cc3 100644
--- a/nix/libutil/util.cc
+++ b/nix/libutil/util.cc
@@ -23,6 +23,10 @@
23#include <sys/prctl.h> 23#include <sys/prctl.h>
24#endif 24#endif
25 25
26#ifdef HAVE_LINUX_CLOSE_RANGE_H
27# include <linux/close_range.h>
28#endif
29
26 30
27extern char * * environ; 31extern char * * environ;
28 32
@@ -1087,12 +1091,19 @@ string runProgram(Path program, bool searchPath, const Strings & args)
1087 1091
1088void closeMostFDs(const set<int> & exceptions) 1092void closeMostFDs(const set<int> & exceptions)
1089{ 1093{
1090 int maxFD = 0; 1094#ifdef HAVE_CLOSE_RANGE
1091 maxFD = sysconf(_SC_OPEN_MAX); 1095 if (exceptions.empty())
1092 for (int fd = 0; fd < maxFD; ++fd) 1096 close_range(3, ~0U, 0);
1093 if (fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO 1097 else
1094 && exceptions.find(fd) == exceptions.end()) 1098#endif
1095 close(fd); /* ignore result */ 1099 {
1100 int maxFD = 0;
1101 maxFD = sysconf(_SC_OPEN_MAX);
1102 for (int fd = 0; fd < maxFD; ++fd)
1103 if (fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO
1104 && exceptions.find(fd) == exceptions.end())
1105 close(fd); /* ignore result */
1106 }
1096} 1107}
1097 1108
1098 1109