From e832b7687ed42ecf0daf7c5deefa86a1445d62fd Mon Sep 17 00:00:00 2001 From: Guillem Jover Date: Mon, 8 Feb 2021 03:45:06 +0100 Subject: [PATCH] closefrom: Use close_range() on Linux when available Closes: !11 Based-on-patch-by: cptpcrd Signed-off-by: Guillem Jover --- src/closefrom.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/closefrom.c b/src/closefrom.c index e2e10a8..087ccad 100644 --- a/src/closefrom.c +++ b/src/closefrom.c @@ -19,6 +19,12 @@ #include +#ifdef __linux__ +# include +# if defined(__NR_close_range) && !defined(SYS_close_range) +# define SYS_close_range __NR_close_range +# endif +#endif #include #include #include @@ -61,6 +67,14 @@ closefrom_close(int fd) #endif } +#if defined(__linux__) && defined(SYS_close_range) +static inline int +sys_close_range(unsigned int fd, unsigned int max_fd, unsigned int flags) +{ + return syscall(SYS_close_range, fd, max_fd, flags); +} +#endif + /* * Close all file descriptors greater than or equal to lowfd. * This is the expensive (fallback) method. @@ -182,11 +196,16 @@ closefrom(int lowfd) if (lowfd < 0) lowfd = 0; - /* Try the fast method first, if possible. */ + /* Try the fast methods first, if possible. */ #if defined(HAVE_FCNTL_CLOSEM) if (fcntl(lowfd, F_CLOSEM, 0) != -1) return; #endif /* HAVE_FCNTL_CLOSEM */ +#if defined(__linux__) && defined(SYS_close_range) + if (sys_close_range(lowfd, UINT_MAX, 0) == 0) + return; +#endif + #if defined(HAVE_PSTAT_GETPROC) if (closefrom_pstat(lowfd) != -1) return;