fusermount: Close file descriptors with close_range() if possible
authorBernd Schubert <bschubert@ddn.com>
Fri, 13 Sep 2024 18:43:33 +0000 (20:43 +0200)
committerBernd Schubert <bernd.schubert@fastmail.fm>
Mon, 16 Sep 2024 11:59:27 +0000 (13:59 +0200)
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.

util/fusermount.c

index b8437a06d1b0a0b5c05c44a7d0357333ed1502b6..852834298315be305225d1da6beddb0d0e5f60f7 100644 (file)
@@ -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);
        }