aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2014-04-10 09:15:40 +0000
committerWerner Koch <[email protected]>2014-04-10 09:15:40 +0000
commit617d3be629229cbebfdc2d26a4e854bc4fe38a68 (patch)
treeb902d19f29973c804ab7268af6d4abef91cff536
parentAdd configure option --enable-fixed-path. (diff)
downloadgpgme-617d3be629229cbebfdc2d26a4e854bc4fe38a68.tar.gz
gpgme-617d3be629229cbebfdc2d26a4e854bc4fe38a68.zip
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.
-rw-r--r--src/posix-io.c51
1 files 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. */
}