diff options
author | Victor Stinner <vstinner@python.org> | 2020-04-24 10:00:51 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-24 10:00:51 (GMT) |
commit | 162c567d164b5742c0d1f3f8bd8c8bab9c117cd0 (patch) | |
tree | bd02253874089c2db84a4f4c0fb68bc478bfc029 /Modules | |
parent | 4cc4d6048efcec43fe866fac96e0c2e57a87b308 (diff) | |
download | cpython-162c567d164b5742c0d1f3f8bd8c8bab9c117cd0.zip cpython-162c567d164b5742c0d1f3f8bd8c8bab9c117cd0.tar.gz cpython-162c567d164b5742c0d1f3f8bd8c8bab9c117cd0.tar.bz2 |
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
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/posixmodule.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3386be0..3d3f6ac 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8687,10 +8687,13 @@ _fdwalk_close_func(void *lohi, int fd) int lo = ((int *)lohi)[0]; int hi = ((int *)lohi)[1]; - if (fd >= hi) + if (fd >= hi) { return 1; - else if (fd >= lo) - close(fd); + } + else if (fd >= lo) { + /* Ignore errors */ + (void)close(fd); + } return 0; } #endif /* HAVE_FDWALK */ @@ -8711,8 +8714,6 @@ os_closerange_impl(PyObject *module, int fd_low, int fd_high) { #ifdef HAVE_FDWALK int lohi[2]; -#else - int i; #endif Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH @@ -8721,8 +8722,20 @@ os_closerange_impl(PyObject *module, int fd_low, int fd_high) lohi[1] = fd_high; fdwalk(_fdwalk_close_func, lohi); #else - for (i = Py_MAX(fd_low, 0); i < fd_high; i++) - close(i); + fd_low = Py_MAX(fd_low, 0); +#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 _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS |