mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-05-31 01:40:06 +02:00
gspawn: Handle ENOSYS from close_range()
It’s possible that GLib will eventually be compiled against a version of
libc which supports `close_range()` (hence `HAVE_CLOSE_RANGE` will be
defined), but then run against an older kernel which doesn’t support it.
In this case, we want to fall back to `fdwalk()`, which should work on
such systems.
This is what cpython does: 3529718925/Python/fileutils.c (L2227)
Spotted by Allison Karlitskaya in !1688.
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
This commit is contained in:
parent
9a519c8bf0
commit
23f1a31923
@ -1330,12 +1330,17 @@ safe_closefrom (int lowfd)
|
|||||||
* simple wrapper of the fcntl command.
|
* simple wrapper of the fcntl command.
|
||||||
*/
|
*/
|
||||||
(void) fcntl (lowfd, F_CLOSEM);
|
(void) fcntl (lowfd, F_CLOSEM);
|
||||||
#elif defined(HAVE_CLOSE_RANGE)
|
#else
|
||||||
|
|
||||||
|
#if defined(HAVE_CLOSE_RANGE)
|
||||||
/* close_range() is available in Linux since kernel 5.9, and on FreeBSD at
|
/* close_range() is available in Linux since kernel 5.9, and on FreeBSD at
|
||||||
* around the same time. It was designed for use in async-signal-safe
|
* around the same time. It was designed for use in async-signal-safe
|
||||||
* situations: https://bugs.python.org/issue38061 */
|
* situations: https://bugs.python.org/issue38061
|
||||||
(void) close_range (lowfd, G_MAXUINT);
|
*
|
||||||
#else
|
* Handle ENOSYS in case it’s supported in libc but not the kernel; if so,
|
||||||
|
* fall back to safe_fdwalk(). */
|
||||||
|
if (close_range (lowfd, G_MAXUINT) != 0 && errno == ENOSYS)
|
||||||
|
#endif /* HAVE_CLOSE_RANGE */
|
||||||
(void) safe_fdwalk (close_func, GINT_TO_POINTER (lowfd));
|
(void) safe_fdwalk (close_func, GINT_TO_POINTER (lowfd));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user