diff options
author | MJ Harvey <mharvey@jumptrading.com> | 2024-08-21 07:05:20 -0500 |
---|---|---|
committer | Bernd Schubert <bernd.schubert@fastmail.fm> | 2024-09-16 13:59:27 +0200 |
commit | 5f137f01c1c8f97e9b3207a651090895e33a7dd3 (patch) | |
tree | 3bad247a093c4145df77a9376d6f5632c539bfec /util/fusermount.c | |
parent | 97991a65699cdb1a2f90fb42c3a3a6dfadbde0be (diff) | |
download | libfuse-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.c | 20 |
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) { |