diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2021-04-22 15:05:31 +0200 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2021-04-23 23:00:55 +0200 |
commit | d388b36da236e66dd42e59d7b5c9d596d6de1961 (patch) | |
tree | da890932900a2a822898e7e1b9511a6822dcb36d /libdm | |
parent | d95b26fae0bdab7d306f0dff1d9328a697e041f3 (diff) | |
download | lvm2-d388b36da236e66dd42e59d7b5c9d596d6de1961.tar.gz |
cov: daemonize avoid leak of FD on error path
Use our common patter for reopening FDs to /dev/null
that avoids leaking FD on error path.
Diffstat (limited to 'libdm')
-rw-r--r-- | libdm/dm-tools/dmfilemapd.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/libdm/dm-tools/dmfilemapd.c b/libdm/dm-tools/dmfilemapd.c index e15f0015f..2a86810ed 100644 --- a/libdm/dm-tools/dmfilemapd.c +++ b/libdm/dm-tools/dmfilemapd.c @@ -653,18 +653,21 @@ static int _daemonise(struct filemap_monitor *fm) } if (!_verbose) { - if (close(STDIN_FILENO)) - _early_log("Error closing stdin"); - if (close(STDOUT_FILENO)) - _early_log("Error closing stdout"); - if (close(STDERR_FILENO)) - _early_log("Error closing stderr"); - if ((open("/dev/null", O_RDONLY) < 0) || - (open("/dev/null", O_WRONLY) < 0) || - (open("/dev/null", O_WRONLY) < 0)) { - _early_log("Error opening stdio streams."); + if ((fd = open("/dev/null", O_RDWR)) == -1) { + _early_log("Error opening /dev/null."); return 0; } + + if ((dup2(fd, STDIN_FILENO) == -1) || + (dup2(fd, STDOUT_FILENO) == -1) || + (dup2(fd, STDERR_FILENO) == -1)) { + if (fd > STDERR_FILENO) + (void) close(fd); + _early_log("Error redirecting stdin/out/err to null."); + return 0; + } + if (fd > STDERR_FILENO) + (void) close(fd); } /* TODO: Use libdaemon/server/daemon-server.c _daemonise() */ for (fd = (int) sysconf(_SC_OPEN_MAX) - 1; fd > STDERR_FILENO; fd--) { |