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>
This commit is contained in:
MJ Harvey 2024-08-21 07:05:20 -05:00 committed by Bernd Schubert
parent 97991a6569
commit 5f137f01c1

View File

@ -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) {