From 617d3be629229cbebfdc2d26a4e854bc4fe38a68 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 10 Apr 2014 11:15:40 +0200 Subject: [PATCH] Make sure a spawned process has all standard fds connected. * src/posix-io.c (_gpgme_io_spawn): dup /dev/null also to unsued stdout. -- Better be sure that stdout of a spawned process is connected to stdout so that the process does not run into a write error if it writes to stdout. AFAICS we always use a connected stdout; thus this is only for correctness. --- src/posix-io.c | 51 ++++++++++++++++++-------------------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/src/posix-io.c b/src/posix-io.c index ceb88316..afee504d 100644 --- a/src/posix-io.c +++ b/src/posix-io.c @@ -402,6 +402,7 @@ _gpgme_io_spawn (const char *path, char *const argv[], unsigned int flags, /* Child. */ int seen_stdin = 0; + int seen_stdout = 0; int seen_stderr = 0; if (atfork) @@ -430,6 +431,8 @@ _gpgme_io_spawn (const char *path, char *const argv[], unsigned int flags, if (child_fd == 0) seen_stdin = 1; + else if (child_fd == 1) + seen_stdout = 1; else if (child_fd == 2) seen_stderr = 1; @@ -451,56 +454,38 @@ _gpgme_io_spawn (const char *path, char *const argv[], unsigned int flags, close (fd_list[i].fd); } - if (! seen_stdin || ! seen_stderr) + if (! seen_stdin || ! seen_stdout || !seen_stderr) { fd = open ("/dev/null", O_RDWR); if (fd == -1) { -#if 0 - /* FIXME: The debug file descriptor is not dup'ed - anyway, so we can't see this. */ - TRACE_LOG1 ("can't open `/dev/null': %s\n", - strerror (errno)); -#endif + /* The debug file descriptor is not dup'ed, so we + can't do a trace output. */ _exit (8); } - /* Make sure that the process has a connected stdin. */ + /* Make sure that the process has connected stdin. */ if (! seen_stdin && fd != 0) { if (dup2 (fd, 0) == -1) - { -#if 0 - /* FIXME: The debug file descriptor is not dup'ed - anyway, so we can't see this. */ - TRACE_LOG1 ("dup2(/dev/null, 0) failed: %s\n", - strerror (errno)); -#endif - _exit (8); - } + _exit (8); } + if (! seen_stdout && fd != 1) + { + if (dup2 (fd, 1) == -1) + _exit (8); + } if (! seen_stderr && fd != 2) - if (dup2 (fd, 2) == -1) - { -#if 0 - /* FIXME: The debug file descriptor is not dup'ed - anyway, so we can't see this. */ - TRACE_LOG1 ("dup2(dev/null, 2) failed: %s\n", - strerror (errno)); -#endif - _exit (8); - } - if (fd != 0 && fd != 2) + { + if (dup2 (fd, 2) == -1) + _exit (8); + } + if (fd != 0 && fd != 1 && fd != 2) close (fd); } execv (path, (char *const *) argv); /* Hmm: in that case we could write a special status code to the status-pipe. */ -#if 0 - /* FIXME: The debug file descriptor is not dup'ed anyway, so - we can't see this. */ - TRACE_LOG1 ("exec of `%s' failed\n", path); -#endif _exit (8); /* End child. */ }