From 5f137f01c1c8f97e9b3207a651090895e33a7dd3 Mon Sep 17 00:00:00 2001 From: MJ Harvey Date: Wed, 21 Aug 2024 07:05:20 -0500 Subject: [PATCH] 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 Signed-off-by: Bernd Schubert --- util/fusermount.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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) {