--- elogd.c.orig 2011-05-20 13:28:48.000000000 -0600 +++ elogd.c 2011-05-20 14:16:12.000000000 -0600 @@ -866,25 +866,27 @@ #ifdef OS_UNIX pid_t child_pid; - int fh, status, i; + int fd[2], status, i; char str[256]; + /* create pipe for parent<->child communication */ + if (pipe(fd) < 0) + return 0; + if ((child_pid = fork()) < 0) return 0; else if (child_pid > 0) { - /* parent process waits for child */ - waitpid(child_pid, &status, 0); + + /* parent does not write to child */ + close(fd[1]); /* read back result */ memset(result, 0, size); - fh = open("/tmp/elog-shell", O_RDONLY); - if (fh > 0) { - i = read(fh, result, size); - close(fh); - } + i = read(fd[0], result, size); + close(fd[0]); - /* remove temporary file */ - remove("/tmp/elog-shell"); + /* parent process waits for child */ + waitpid(child_pid, &status, 0); /* strip trailing CR/LF */ while (strlen(result) > 0 && (result[strlen(result) - 1] == '\r' || result[strlen(result) - 1] == '\n')) @@ -926,8 +928,7 @@ eprintf("Falling back to user \"%s\"\n", str); } - /* execute shell with redirection to /tmp/elog-shell */ - sprintf(str, "/bin/sh -c \"%s\" > /tmp/elog-shell 2>&1", cmd); + /* execute command with redirection to pipe to parent */ if (is_verbose()) { efputs("Going to execute: "); @@ -935,7 +936,17 @@ efputs("\n"); } - system(str); + /* redirect stdout/stderr to pipe for parent to read */ + close(STDOUT_FILENO); dup2(fd[1], STDOUT_FILENO); + close(STDERR_FILENO); dup2(fd[1], STDERR_FILENO); + /* child does not read the pipe */ + close(fd[0]); + /* child nolonger uses fd[1] - use stderr or stdout instead */ + close(fd[1]); + + if (system(cmd) == -1) { + fprintf(stderr, "unable to execute command: %s\n", cmd); + } _exit(0); }