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
/* 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
AC_CHECK_FUNCS_ONCE([
accept4
clearenv
+close_range
closefrom
fpathconf
getgrouplist
#include "dbus-credentials.h"
#include "dbus-nonce.h"
+#include <limits.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
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 */
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);
}