git: ensure 0/1/2 are open in main()
authorThomas Rast <trast@inf.ethz.ch>
Tue, 16 Jul 2013 09:27:37 +0000 (11:27 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Jul 2013 19:52:16 +0000 (12:52 -0700)
Not having an open FD in the 0--2 range can lead to strange results,
for example, a subsequent open() may return 2 (stderr) and then a
die() would clobber this file.

git-daemon and git-shell already guarded against this, but apparently
users also manage to trip over it in other git commands. So we call
sanitize_stdfds() during main git startup.

Since these FDs are inherited, this covers all use of 'git foo ...',
and all internal C commands when called directly. It does not fix
shell/perl commands called directly.

Signed-off-by: Thomas Rast <trast@inf.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git.c
diff --git a/git.c b/git.c
index c598dc63670ba49d9f6f720834df788dc41b3a44..02b4b140ae3c8070473a7a9c90584de7fbcf30b9 100644 (file)
--- a/git.c
+++ b/git.c
@@ -505,6 +505,13 @@ int main(int argc, const char **argv)
        if (!cmd)
                cmd = "git-help";
 
+       /*
+        * Always open file descriptors 0/1/2 to avoid clobbering files
+        * in die().  It also avoids messing up when the pipes are dup'ed
+        * onto stdin/stdout/stderr in the child processes we spawn.
+        */
+       sanitize_stdfds();
+
        git_setup_gettext();
 
        /*