aboutsummaryrefslogtreecommitdiffstats
path: root/util/fusermount.c
diff options
context:
space:
mode:
authorMJ Harvey <mharvey@jumptrading.com>2024-08-21 07:05:20 -0500
committerBernd Schubert <bernd.schubert@fastmail.fm>2024-09-16 13:59:27 +0200
commit5f137f01c1c8f97e9b3207a651090895e33a7dd3 (patch)
tree3bad247a093c4145df77a9376d6f5632c539bfec /util/fusermount.c
parent97991a65699cdb1a2f90fb42c3a3a6dfadbde0be (diff)
downloadlibfuse-5f137f01c1c8f97e9b3207a651090895e33a7dd3.tar.gz
fusermount: close inherited fds
When using the auto_unmount option, the fusermount3 watchdog process retains any inherited file descriptors. This PR ensures they are closed. Reason is that FDs that are kept open for a long time might cause issues for applications using libfuse, for example if these expect a pipe close, but the pipe is kept open through the inherited file descriptor. See for example: https://github.com/cvmfs/cvmfs/issues/3645 Signed-off-by: MJ Harvey <mharvey@jumptrading.com> Signed-off-by: Bernd Schubert <bschubert@ddn.com>
Diffstat (limited to 'util/fusermount.c')
-rw-r--r--util/fusermount.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/util/fusermount.c b/util/fusermount.c
index f37c616..b8437a0 100644
--- a/util/fusermount.c
+++ b/util/fusermount.c
@@ -1448,6 +1448,21 @@ static void show_version(void)
exit(0);
}
+/*
+ * Close all inherited fds that are not needed
+ * Ideally these wouldn't come up at all, applications should better
+ * use FD_CLOEXEC / O_CLOEXEC
+ */
+static void close_inherited_fds(int cfd)
+{
+ int max_fd = sysconf(_SC_OPEN_MAX);
+
+ for (int fd = 3; fd <= max_fd; fd++) {
+ if (fd != cfd)
+ close(fd);
+ }
+}
+
int main(int argc, char *argv[])
{
sigset_t sigset;
@@ -1599,8 +1614,11 @@ int main(int argc, char *argv[])
wait_for_auto_unmount:
/* Become a daemon and wait for the parent to exit or die.
ie For the control socket to get closed.
- btw We don't want to use daemon() function here because
+ Btw, we don't want to use daemon() function here because
it forks and messes with the file descriptors. */
+
+ close_inherited_fds(cfd);
+
setsid();
res = chdir("/");
if (res == -1) {