Skip to content

Commit

Permalink
mingw: ignore HOMEDRIVE/HOMEPATH if it points to Windows' system dire…
Browse files Browse the repository at this point in the history
…ctory

Internally, Git expects the environment variable `HOME` to be set, and
to point to the current user's home directory.

This environment variable is not set by default on Windows, and
therefore Git tries its best to construct one if it finds `HOME` unset.

There are actually two different approaches Git tries: first, it looks
at `HOMEDRIVE`/`HOMEPATH` because this is widely used in corporate
environments with roaming profiles, and a user generally wants their
global Git settings to be in a roaming profile.

Only when `HOMEDRIVE`/`HOMEPATH` is either unset or does not point to a
valid location, Git will fall back to using `USERPROFILE` instead.

However, starting with Windows Vista, for secondary logons and services,
the environment variables `HOMEDRIVE`/`HOMEPATH` point to Windows'
system directory (usually `C:\Windows\system32`).

That is undesirable, and that location is usually write-protected anyway.

So let's verify that the `HOMEDRIVE`/`HOMEPATH` combo does not point to
Windows' system directory before using it, falling back to `USERPROFILE`
if it does.

This fixes #2709

Initial-Path-by: Ivan Pozdeev <vano@mail.mipt.ru>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
  • Loading branch information
dscho committed Sep 22, 2022
1 parent ed7747c commit 4a1dc44
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion compat/mingw.c
Expand Up @@ -2632,6 +2632,18 @@ static size_t append_system_bin_dirs(char *path, size_t size)
}
#endif

static int is_system32_path(const char *path)
{
WCHAR system32[MAX_PATH], wpath[MAX_PATH];

if (xutftowcs_path(wpath, path) < 0 ||
!GetSystemDirectoryW(system32, ARRAY_SIZE(system32)) ||
_wcsicmp(system32, wpath))
return 0;

return 1;
}

static void setup_windows_environment(void)
{
char *tmp = getenv("TMPDIR");
Expand Down Expand Up @@ -2672,7 +2684,8 @@ static void setup_windows_environment(void)
strbuf_addstr(&buf, tmp);
if ((tmp = getenv("HOMEPATH"))) {
strbuf_addstr(&buf, tmp);
if (is_directory(buf.buf))
if (!is_system32_path(buf.buf) &&
is_directory(buf.buf))
setenv("HOME", buf.buf, 1);
else
tmp = NULL; /* use $USERPROFILE */
Expand Down

0 comments on commit 4a1dc44

Please sign in to comment.