mirror of
https://github.com/libfuse/libfuse.git
synced 2024-11-23 04:04:31 +08:00
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:
parent
97991a6569
commit
5f137f01c1
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user