gh-112970: Detect and use closefrom() when available (#112969)

glibc-2.34 implements closefrom(3) using the same semantics as on BSD.
Check for closefrom() in configure and use the check result in
fileutils.c, rather than hardcoding a FreeBSD check.

Some implementations of closefrom() return an int. Explicitly discard 
the return value by casting it to void, to avoid future compiler
warnings.

Signed-off-by: Sam James <sam@gentoo.org>
This commit is contained in:
Sam James 2023-12-12 10:25:27 +00:00 committed by GitHub
parent 0d2fe6bab0
commit c454e934d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 14 additions and 4 deletions

View File

@ -0,0 +1 @@
Use :c:func:`!closefrom` on Linux where available (e.g. glibc-2.34), rather than only FreeBSD.

View File

@ -2878,9 +2878,9 @@ done:
* non-opened fd in the middle.
* 2b. If fdwalk(3) isn't available, just do a plain close(2) loop.
*/
#ifdef __FreeBSD__
#ifdef HAVE_CLOSEFROM
# define USE_CLOSEFROM
#endif /* __FreeBSD__ */
#endif /* HAVE_CLOSEFROM */
#ifdef HAVE_FDWALK
# define USE_FDWALK
@ -2922,7 +2922,7 @@ _Py_closerange(int first, int last)
#ifdef USE_CLOSEFROM
if (last >= sysconf(_SC_OPEN_MAX)) {
/* Any errors encountered while closing file descriptors are ignored */
closefrom(first);
(void)closefrom(first);
}
else
#endif /* USE_CLOSEFROM */

6
configure generated vendored
View File

@ -17225,6 +17225,12 @@ if test "x$ac_cv_func_clock" = xyes
then :
printf "%s\n" "#define HAVE_CLOCK 1" >>confdefs.h
fi
ac_fn_c_check_func "$LINENO" "closefrom" "ac_cv_func_closefrom"
if test "x$ac_cv_func_closefrom" = xyes
then :
printf "%s\n" "#define HAVE_CLOSEFROM 1" >>confdefs.h
fi
ac_fn_c_check_func "$LINENO" "close_range" "ac_cv_func_close_range"
if test "x$ac_cv_func_close_range" = xyes

View File

@ -4745,7 +4745,7 @@ fi
# checks for library functions
AC_CHECK_FUNCS([ \
accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \
accept4 alarm bind_textdomain_codeset chmod chown clock closefrom close_range confstr \
copy_file_range ctermid dup dup3 execv explicit_bzero explicit_memset \
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \

View File

@ -157,6 +157,9 @@
/* Define to 1 if you have the `clock_settime' function. */
#undef HAVE_CLOCK_SETTIME
/* Define to 1 if you have the `closefrom' function. */
#undef HAVE_CLOSEFROM
/* Define to 1 if you have the `close_range' function. */
#undef HAVE_CLOSE_RANGE