diff options
| author | Werner Koch <[email protected]> | 2014-04-10 09:15:40 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2014-04-10 09:15:40 +0000 | 
| commit | 617d3be629229cbebfdc2d26a4e854bc4fe38a68 (patch) | |
| tree | b902d19f29973c804ab7268af6d4abef91cff536 /src/posix-io.c | |
| parent | Add configure option --enable-fixed-path. (diff) | |
| download | gpgme-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.
Diffstat (limited to 'src/posix-io.c')
| -rw-r--r-- | src/posix-io.c | 51 | 
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.  */  	} | 
