bpo-38061: os.closerange() uses closefrom() on FreeBSD (GH-19696)

On FreeBSD, os.closerange(fd_low, fd_high) now calls
closefrom(fd_low) if fd_high is greater than or equal to
sysconf(_SC_OPEN_MAX).

Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans
(kevans) and Kubilay Kocak (koobs):
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274
This commit is contained in:
Victor Stinner 2020-04-24 12:00:51 +02:00 committed by GitHub
parent 4cc4d6048e
commit 162c567d16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 7 deletions

View File

@ -0,0 +1,6 @@
On FreeBSD, ``os.closerange(fd_low, fd_high)`` now calls ``closefrom(fd_low)``
if *fd_high* is greater than or equal to ``sysconf(_SC_OPEN_MAX)``.
Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans (kevans)
and Kubilay Kocak (koobs):
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274

View File

@ -8687,10 +8687,13 @@ _fdwalk_close_func(void *lohi, int fd)
int lo = ((int *)lohi)[0]; int lo = ((int *)lohi)[0];
int hi = ((int *)lohi)[1]; int hi = ((int *)lohi)[1];
if (fd >= hi) if (fd >= hi) {
return 1; return 1;
else if (fd >= lo) }
close(fd); else if (fd >= lo) {
/* Ignore errors */
(void)close(fd);
}
return 0; return 0;
} }
#endif /* HAVE_FDWALK */ #endif /* HAVE_FDWALK */
@ -8711,8 +8714,6 @@ os_closerange_impl(PyObject *module, int fd_low, int fd_high)
{ {
#ifdef HAVE_FDWALK #ifdef HAVE_FDWALK
int lohi[2]; int lohi[2];
#else
int i;
#endif #endif
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
_Py_BEGIN_SUPPRESS_IPH _Py_BEGIN_SUPPRESS_IPH
@ -8721,8 +8722,20 @@ os_closerange_impl(PyObject *module, int fd_low, int fd_high)
lohi[1] = fd_high; lohi[1] = fd_high;
fdwalk(_fdwalk_close_func, lohi); fdwalk(_fdwalk_close_func, lohi);
#else #else
for (i = Py_MAX(fd_low, 0); i < fd_high; i++) fd_low = Py_MAX(fd_low, 0);
close(i); #ifdef __FreeBSD__
if (fd_high >= sysconf(_SC_OPEN_MAX)) {
/* Any errors encountered while closing file descriptors are ignored */
closefrom(fd_low);
}
else
#endif
{
for (int i = fd_low; i < fd_high; i++) {
/* Ignore errors */
(void)close(i);
}
}
#endif #endif
_Py_END_SUPPRESS_IPH _Py_END_SUPPRESS_IPH
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS