diff options
author | Johannes Sixt <j6t@kdbg.org> | 2011-06-06 09:08:13 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-06-06 11:35:10 -0700 |
commit | df599e9612788b728ce43a03159b85f1fe624d6a (patch) | |
tree | 779040c908fbf1e19318c73f19e2c69e0b8cebb9 /compat | |
parent | 06bc4b796ad69ba93f0a8c451368602e0553c2d3 (diff) | |
download | git-df599e9612788b728ce43a03159b85f1fe624d6a.tar.gz |
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 <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat')
-rw-r--r-- | compat/mingw.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index e341ac2abd..237a8c0e1f 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; } |