summaryrefslogtreecommitdiff
path: root/libdm
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2021-04-22 15:05:31 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2021-04-23 23:00:55 +0200
commitd388b36da236e66dd42e59d7b5c9d596d6de1961 (patch)
treeda890932900a2a822898e7e1b9511a6822dcb36d /libdm
parentd95b26fae0bdab7d306f0dff1d9328a697e041f3 (diff)
downloadlvm2-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.c23
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--) {