Use /dev/null for stdout/stderr in libzfs_run_process().

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
This commit is contained in:
Gunnar Beutner 2011-07-29 10:17:46 +02:00 committed by Brian Behlendorf
parent 5333eb0b3b
commit 3132cb397a
1 changed files with 10 additions and 3 deletions

View 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);