summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2016-07-01 02:06:02 -0400
committerJohannes Schindelin <johannes.schindelin@gmx.de>2016-07-02 09:55:23 +0200
commit095a935b52fa47f7a94f55ed12aac59987bfa8d6 (patch)
tree81baf6655cf6197b6834e07ec3d385619b746453
parent8679188bbb403318eb1a61c49d075007c48ece66 (diff)
downloadgit-095a935b52fa47f7a94f55ed12aac59987bfa8d6.tar.gz
common-main: call sanitize_stdfds()
This is setup that should be done in every program for safety, but we never got around to adding it everywhere (so builtins benefited from the call in git.c, but any external commands did not). Putting it in the common main() gives us this safety everywhere. Note that the case in daemon.c is a little funny. We wait until we know whether we want to daemonize, and then either: - call daemonize(), which will close stdio and reopen it to /dev/null under the hood - sanitize_stdfds(), to fix up any odd cases But that is way too late; the point of sanitizing is to give us reliable descriptors on 0/1/2, and we will already have executed code, possibly called die(), etc. The sanitizing should be the very first thing that happens. With this patch, git-daemon will sanitize first, and can remove the call in the non-daemonize case. It does mean that daemonize() may just end up closing the descriptors we opened, but that's not a big deal (it's not wrong to do so, nor is it really less optimal than the case where our parent process redirected us from /dev/null ahead of time). Signed-off-by: Jeff King <peff@peff.net>
-rw-r--r--common-main.c9
-rw-r--r--daemon.c3
-rw-r--r--git.c7
-rw-r--r--shell.c7
4 files changed, 9 insertions, 17 deletions
diff --git a/common-main.c b/common-main.c
index 87964b62db..a7182371ef 100644
--- a/common-main.c
+++ b/common-main.c
@@ -1,8 +1,15 @@
-#include "git-compat-util.h"
+#include "cache.h"
#include "exec_cmd.h"
int main(int argc, const char **argv)
{
+ /*
+ * 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();
+
argv[0] = git_extract_argv0_path(argv[0]);
return cmd_main(argc, argv);
diff --git a/daemon.c b/daemon.c
index d33ee5a146..8646f33184 100644
--- a/daemon.c
+++ b/daemon.c
@@ -1378,8 +1378,7 @@ int cmd_main(int argc, const char **argv)
if (detach) {
if (daemonize())
die("--detach not supported on this platform");
- } else
- sanitize_stdfds();
+ }
if (pid_file)
write_file(pid_file, "%"PRIuMAX, (uintmax_t) getpid());
diff --git a/git.c b/git.c
index 3b4e12d7c6..b65083ca97 100644
--- a/git.c
+++ b/git.c
@@ -639,13 +639,6 @@ int cmd_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();
-
restore_sigpipe_to_default();
git_setup_gettext();
diff --git a/shell.c b/shell.c
index ca00807d7e..5e70acb9a6 100644
--- a/shell.c
+++ b/shell.c
@@ -148,13 +148,6 @@ int cmd_main(int argc, const char **argv)
git_setup_gettext();
/*
- * 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();
-
- /*
* Special hack to pretend to be a CVS server
*/
if (argc == 2 && !strcmp(argv[1], "cvs server")) {