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.
This commit is contained in:
parent
766355b5d4
commit
617d3be629
@ -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. */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user