Make sure a spawned process has all standard fds connected.
authorWerner Koch <wk@gnupg.org>
Thu, 10 Apr 2014 09:15:40 +0000 (11:15 +0200)
committerWerner Koch <wk@gnupg.org>
Thu, 10 Apr 2014 09:15:40 +0000 (11:15 +0200)
* 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

index ceb8831..afee504 100644 (file)
@@ -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 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.  */
        }