From: Johannes Sixt Date: Mon, 6 Jun 2011 07:08:13 +0000 (+0200) Subject: Windows: teach getenv to do a case-sensitive search X-Git-Tag: v1.7.7-rc0~118^2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=df599e9;p=git.git Windows: teach getenv to do a case-sensitive search getenv() on Windows looks up environment variables in a case-insensitive manner. Even though all documentations claim that the environment is case-insensitive, it is possible for applications to pass an environment to child processes that has variables that differ only in case. Bash on Windows does this, for example, and sh-i18n--envsubst depends on this behavior. With this patch environment variables are first looked up in a case-sensitive manner; only if this finds nothing, the system's getenv() is used as a fallback. Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- diff --git a/compat/mingw.c b/compat/mingw.c index e341ac2ab..237a8c0e1 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -1116,14 +1116,31 @@ char **make_augmented_environ(const char *const *vars) } #undef getenv + +/* + * The system's getenv looks up the name in a case-insensitive manner. + * This version tries a case-sensitive lookup and falls back to + * case-insensitive if nothing was found. This is necessary because, + * as a prominent example, CMD sets 'Path', but not 'PATH'. + * Warning: not thread-safe. + */ +static char *getenv_cs(const char *name) +{ + size_t len = strlen(name); + int i = lookup_env(environ, name, len); + if (i >= 0) + return environ[i] + len + 1; /* skip past name and '=' */ + return getenv(name); +} + char *mingw_getenv(const char *name) { - char *result = getenv(name); + char *result = getenv_cs(name); if (!result && !strcmp(name, "TMPDIR")) { /* on Windows it is TMP and TEMP */ - result = getenv("TMP"); + result = getenv_cs("TMP"); if (!result) - result = getenv("TEMP"); + result = getenv_cs("TEMP"); } return result; }