git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/5] common-main: call sanitize_stdfds()

From
Jeff King <peff@peff.net>
Date
Jul 1, 2016, 06:06 UTC
Message-ID
<20160701060602.GC4593@sigill.intra.peff.net>
In-Reply-To
<20160701055532.GA4488@sigill.intra.peff.net>

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>
---
 common-main.c | 9 ++++++++-
 daemon.c      | 3 +--
 git.c         | 7 -------
 shell.c       | 7 -------
 4 files changed, 9 insertions(+), 17 deletions(-)
diff --git a/common-main.c b/common-main.c
index 57c912a..353c6ea 100644
--- a/common-main.c
+++ b/common-main.c
@@ -1,4 +1,4 @@
-#include "git-compat-util.h"
+#include "cache.h"
 #include "exec_cmd.h"
 
 int main(int argc, char **av)
@@ -9,6 +9,13 @@ int main(int argc, char **av)
 	 */
 	const char **argv = (const char **)av;
 
+	/*
+	 * 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 d33ee5a..8646f33 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 3b4e12d..b65083c 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 ca00807..5e70acb 100644
--- a/shell.c
+++ b/shell.c
@@ -147,13 +147,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
 	 */
-- 
2.9.0.317.g65b4e7c
Previous: Johannes SchindelinNext: Jeff King
Message 12 of 21 in “git-credentials-store.exe crash”
  1. dmh@ucar.eduJun 30, 2016
  2. Jeff KingJul 1, 2016
  3. 0/5 consistent setup code for external commandsJeff King, Jul 1, 2016
  4. 1/5 add an extra level of indirection to main()Jeff King, Jul 1, 2016
  5. Johannes SchindelinJul 1, 2016
  6. Jeff KingJul 1, 2016
  7. Johannes SchindelinJul 1, 2016
  8. Jeff KingJul 1, 2016
  9. Johannes SchindelinJul 2, 2016
  10. 2/5 common-main: call git_extract_argv0_path()Jeff King, Jul 1, 2016
  11. Johannes SchindelinJul 1, 2016
  12. 3/5 common-main: call sanitize_stdfds()Jeff King, Jul 1, 2016
  13. 5/5 common-main: call git_setup_gettext()Jeff King, Jul 1, 2016
  14. 4/5 common-main: call restore_sigpipe_to_default()Jeff King, Jul 1, 2016
  15. Johannes SchindelinJul 1, 2016
  16. Junio C HamanoJul 1, 2016
  17. Jeff KingJul 1, 2016
  18. Junio C HamanoJul 6, 2016
  19. Johannes SchindelinJul 6, 2016
  20. Johannes SchindelinJul 1, 2016
  21. Jeff KingJul 1, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.