Use /dev/null for stdout/stderr in libzfs_run_process().
authorGunnar Beutner <gunnar@beutner.name>
Fri, 29 Jul 2011 08:17:46 +0000 (10:17 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 1 Aug 2011 20:52:23 +0000 (13:52 -0700)
Simply closing the stdout and/or stderr file descriptors for
the child process can have bad side effects if for example
the child writes to stdout/stderr after open()ing a file.
The open() call might have returned the same file descriptor
one would usually expect for stdout/stderr (1 and 2), thereby
causing mis-directed writes.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #190

lib/libzfs/libzfs_util.c

index f55b658..5f6763c 100644 (file)
@@ -635,15 +635,22 @@ int
 libzfs_run_process(const char *path, char *argv[], int flags)
 {
        pid_t pid;
-       int rc;
+       int rc, devnull_fd;
 
        pid = vfork();
        if (pid == 0) {
+               devnull_fd = open("/dev/null", O_WRONLY);
+
+               if (devnull_fd < 0)
+                       _exit(-1);
+
                if (!(flags & STDOUT_VERBOSE))
-                       close(STDOUT_FILENO);
+                       (void) dup2(devnull_fd, STDOUT_FILENO);
 
                if (!(flags & STDERR_VERBOSE))
-                       close(STDERR_FILENO);
+                       (void) dup2(devnull_fd, STDERR_FILENO);
+
+               close(devnull_fd);
 
                (void) execvp(path, argv);
                _exit(-1);