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

[PATCH 1/2] start_command: do not clobber cmd->env on Windows code path

From
Johannes Sixt <j6t@kdbg.org>
Date
Sep 11, 2009, 17:40 UTC
Message-ID
<200909111940.08652.j6t@kdbg.org>
In-Reply-To
<1252560077-1725-1-git-send-email-snaury@gmail.com>

Previously, it would not be possible to call start_command twice for the same struct child_process that has env set.

The fix is achieved by moving the loop that modifies the environment block into a helper function. This also allows us to make two other helper functions static.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
 We don't call start_command twice in a row anywhere in git.git, but
 msysgit has a patch that does, and with the next patch the buglet would
 be triggered.
 Even after this patch, other members of *cmd are clobbered, so it could
 be argued that this patch is unnecessary, but at least the Windows code
 path now keeps the same members that the Unix code path keeps, and it
 makes start_command easier to read by moving a loop into a helper.
 -- Hannes
 compat/mingw.c |   16 ++++++++++++++--
 compat/mingw.h |    3 +--
 run-command.c  |    7 ++-----
 3 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index bed4178..36ef8d3 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -824,7 +824,7 @@ void mingw_execvp(const char *cmd, char *const *argv)
 	free_path_split(path);
 }
 
-char **copy_environ()
+static char **copy_environ(void)
 {
 	char **env;
 	int i = 0;
@@ -861,7 +861,7 @@ static int lookup_env(char **env, const char *name, size_t nmln)
 /*
  * If name contains '=', then sets the variable, otherwise it unsets it
  */
-char **env_setenv(char **env, const char *name)
+static char **env_setenv(char **env, const char *name)
 {
 	char *eq = strchrnul(name, '=');
 	int i = lookup_env(env, name, eq-name);
@@ -886,6 +886,18 @@ char **env_setenv(char **env, const char *name)
 	return env;
 }
 
+/*
+ * Copies global environ and adjusts variables as specified by vars.
+ */
+char **make_augmented_environ(const char *const *vars)
+{
+	char **env = copy_environ();
+
+	while (*vars)
+		env = env_setenv(env, *vars++);
+	return env;
+}
+
 /* this is the first function to call into WS_32; initialize it */
 #undef gethostbyname
 struct hostent *mingw_gethostbyname(const char *host)
diff --git a/compat/mingw.h b/compat/mingw.h
index 948de66..c43917c 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -222,9 +222,8 @@ void mingw_open_html(const char *path);
  * helpers
  */
 
-char **copy_environ(void);
+char **make_augmented_environ(const char *const *vars);
 void free_environ(char **env);
-char **env_setenv(char **env, const char *name);
 
 /*
  * A replacement of main() that ensures that argv[0] has a path
diff --git a/run-command.c b/run-command.c
index f3e7abb..ac314a5 100644
--- a/run-command.c
+++ b/run-command.c
@@ -173,11 +173,8 @@ fail_pipe:
 
 	if (cmd->dir)
 		die("chdir in start_command() not implemented");
-	if (cmd->env) {
-		env = copy_environ();
-		for (; *cmd->env; cmd->env++)
-			env = env_setenv(env, *cmd->env);
-	}
+	if (cmd->env)
+		env = make_augmented_environ(cmd->env);
 
 	if (cmd->git_cmd) {
 		cmd->argv = prepare_git_cmd(cmd->argv);
-- 
1.6.5.rc0.28.gfb9b
Next: Johannes Sixt
Message 1 of 3 in “start_command: do not clobber cmd->env on Windows code path”
  1. 1/2 start_command: do not clobber cmd->env on Windows code pathJohannes Sixt, Sep 11, 2009
  2. 2/2 pager: set LESS=FRSX also on WindowsJohannes Sixt, Sep 11, 2009
  3. Junio C HamanoSep 12, 2009

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.