Signed-off-by: Brandon Williams <bmw...@google.com>
---
 run-command.c | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/run-command.c b/run-command.c
index 5e2a03145..6751b8319 100644
--- a/run-command.c
+++ b/run-command.c
@@ -117,18 +117,6 @@ static inline void close_pair(int fd[2])
        close(fd[1]);
 }
 
-#ifndef GIT_WINDOWS_NATIVE
-static inline void dup_devnull(int to)
-{
-       int fd = open("/dev/null", O_RDWR);
-       if (fd < 0)
-               die_errno(_("open /dev/null failed"));
-       if (dup2(fd, to) < 0)
-               die_errno(_("dup2(%d,%d) failed"), fd, to);
-       close(fd);
-}
-#endif
-
 static char *locate_in_PATH(const char *file)
 {
        const char *p = getenv("PATH");
@@ -458,12 +446,20 @@ int start_command(struct child_process *cmd)
 #ifndef GIT_WINDOWS_NATIVE
 {
        int notify_pipe[2];
+       int null_fd = -1;
        char **childenv;
        struct argv_array argv = ARGV_ARRAY_INIT;
 
        if (pipe(notify_pipe))
                notify_pipe[0] = notify_pipe[1] = -1;
 
+       if (cmd->no_stdin || cmd->no_stdout || cmd->no_stderr) {
+               null_fd = open("/dev/null", O_RDWR | O_CLOEXEC | O_NONBLOCK);
+               if (null_fd < 0)
+                       die_errno(_("open /dev/null failed"));
+               set_cloexec(null_fd);
+       }
+
        prepare_cmd(&argv, cmd);
        childenv = prep_childenv(cmd->env);
 
@@ -487,7 +483,7 @@ int start_command(struct child_process *cmd)
                atexit(notify_parent);
 
                if (cmd->no_stdin)
-                       dup_devnull(0);
+                       dup2(null_fd, 0);
                else if (need_in) {
                        dup2(fdin[0], 0);
                        close_pair(fdin);
@@ -497,7 +493,7 @@ int start_command(struct child_process *cmd)
                }
 
                if (cmd->no_stderr)
-                       dup_devnull(2);
+                       dup2(null_fd, 2);
                else if (need_err) {
                        dup2(fderr[1], 2);
                        close_pair(fderr);
@@ -507,7 +503,7 @@ int start_command(struct child_process *cmd)
                }
 
                if (cmd->no_stdout)
-                       dup_devnull(1);
+                       dup2(null_fd, 1);
                else if (cmd->stdout_to_stderr)
                        dup2(2, 1);
                else if (need_out) {
@@ -558,6 +554,8 @@ int start_command(struct child_process *cmd)
        }
        close(notify_pipe[0]);
 
+       if (null_fd > 0)
+               close(null_fd);
        argv_array_clear(&argv);
        free(childenv);
 }
-- 
2.12.2.762.g0e3151a226-goog

Reply via email to