From: Bernd Schubert Date: Fri, 13 Sep 2024 18:43:33 +0000 (+0200) Subject: fusermount: Close file descriptors with close_range() if possible X-Git-Tag: fuse-3.17.1-rc0~72 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=3fe1b25d51e74416acb26aaf495adb524ee61342;p=qemu-gpiodev%2Flibfuse.git fusermount: Close file descriptors with close_range() if possible close_range() is much more efficient. Also remove the lower limit of 3 and set it to 0, as 0 to 1 might have been closed by the application and might be valid. --- diff --git a/util/fusermount.c b/util/fusermount.c index b8437a0..8528342 100644 --- a/util/fusermount.c +++ b/util/fusermount.c @@ -1456,8 +1456,33 @@ static void show_version(void) static void close_inherited_fds(int cfd) { int max_fd = sysconf(_SC_OPEN_MAX); + int rc; - for (int fd = 3; fd <= max_fd; fd++) { +#ifdef CLOSE_RANGE_CLOEXEC + /* high range first to be able to log errors through stdout/err*/ + rc = close_range(cfd + 1, ~0U, 0); + if (rc < 0) { + fprintf(stderr, "Failed to close high range of FDs: %s", + strerror(errno)); + goto fallback; + } + + rc = close_range(0, cfd - 1, 0); + if (rc < 0) { + fprintf(stderr, "Failed to close low range of FDs: %s", + strerror(errno)); + goto fallback; + } +#endif + +fallback: + /* + * This also needs to close stdout/stderr, as the application + * using libfuse might have closed these FDs and might be using + * it. Although issue is now that logging errors won't be possible + * after that. + */ + for (int fd = 0; fd <= max_fd; fd++) { if (fd != cfd) close(fd); }