From: Simon McVittie Date: Tue, 1 Mar 2022 19:33:06 +0000 (+0000) Subject: sysdeps: Use close_range() if available X-Git-Tag: dbus-1.15.0~72^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee694ade6199932bc9e7ae40f7202c9426599c72;p=thirdparty%2Fdbus.git sysdeps: Use close_range() if available The version with no flags set, which is a slight generalization of closefrom(), is available on recent Linux and FreeBSD. The version with CLOSE_RANGE_CLOEXEC is Linux-specific. Signed-off-by: Simon McVittie --- diff --git a/cmake/ConfigureChecks.cmake b/cmake/ConfigureChecks.cmake index 78b0fa952..f2ca64c71 100644 --- a/cmake/ConfigureChecks.cmake +++ b/cmake/ConfigureChecks.cmake @@ -53,6 +53,7 @@ check_symbol_exists(setenv "stdlib.h" HAVE_SETENV) # check_symbol_exists(unsetenv "stdlib.h" HAVE_UNSETENV) # dbus-sysdeps.c check_symbol_exists(clearenv "stdlib.h" HAVE_CLEARENV) # dbus-sysdeps.c check_symbol_exists(closefrom "unistd.h" HAVE_CLOSEFROM) # dbus-sysdeps-unix.c +check_symbol_exists(close_range "unistd.h" HAVE_CLOSE_RANGE) # dbus-sysdeps-unix.c check_symbol_exists(writev "sys/uio.h" HAVE_WRITEV) # dbus-sysdeps.c, dbus-sysdeps-win.c check_symbol_exists(setrlimit "sys/resource.h" HAVE_SETRLIMIT) # dbus-sysdeps.c, dbus-sysdeps-win.c, test/test-segfault.c check_symbol_exists(socketpair "sys/socket.h" HAVE_SOCKETPAIR) # dbus-sysdeps.c diff --git a/cmake/config.h.cmake b/cmake/config.h.cmake index 48c5db43e..74299d1ea 100644 --- a/cmake/config.h.cmake +++ b/cmake/config.h.cmake @@ -204,6 +204,9 @@ /* Define to 1 if you have closefrom */ #cmakedefine HAVE_CLOSEFROM 1 +/* Define to 1 if you have close_range */ +#cmakedefine HAVE_CLOSE_RANGE 1 + /* Define to 1 if you have writev */ #cmakedefine HAVE_WRITEV 1 diff --git a/configure.ac b/configure.ac index dbaf14b77..afe21813f 100644 --- a/configure.ac +++ b/configure.ac @@ -382,6 +382,7 @@ AS_IF([test x$enable_code_coverage = xyes],[ AC_CHECK_FUNCS_ONCE([ accept4 clearenv +close_range closefrom fpathconf getgrouplist diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c index 9640e79f1..c3dd0b83e 100644 --- a/dbus/dbus-sysdeps-unix.c +++ b/dbus/dbus-sysdeps-unix.c @@ -37,6 +37,7 @@ #include "dbus-credentials.h" #include "dbus-nonce.h" +#include #include #include #include @@ -4796,6 +4797,11 @@ act_on_fds_3_and_up (void (*func) (int fd)) void _dbus_close_all (void) { +#ifdef HAVE_CLOSE_RANGE + if (close_range (3, INT_MAX, 0) == 0) + return; +#endif + /* Some library implementations of closefrom() are not async-signal-safe, * and we call _dbus_close_all() after forking, so we only do this on * operating systems where we know that closefrom() is a system call */ @@ -4818,6 +4824,11 @@ _dbus_close_all (void) void _dbus_fd_set_all_close_on_exec (void) { +#if defined(HAVE_CLOSE_RANGE) && defined(CLOSE_RANGE_CLOEXEC) + if (close_range (3, INT_MAX, CLOSE_RANGE_CLOEXEC) == 0) + return; +#endif + act_on_fds_3_and_up (_dbus_fd_set_close_on_exec); }