Skip to content

Commit 074da27

Browse files
dschoGit for Windows Build Agent
authored andcommitted
mingw: do resolve symlinks in getcwd()
As pointed out in #1676, the `git rev-parse --is-inside-work-tree` command currently fails when the current directory's path contains symbolic links. The underlying reason for this bug is that `getcwd()` is supposed to resolve symbolic links, but our `mingw_getcwd()` implementation did not. We do have all the building blocks for that, though: the `GetFinalPathByHandleW()` function will resolve symbolic links. However, we only called that function if `GetLongPathNameW()` failed, for historical reasons: the latter function was supported for a long time, but the former API function was introduced only with Windows Vista, and we used to support also Windows XP. With that support having been dropped, we are free to call the symbolic link-resolving function right away. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent 1c12b51 commit 074da27

File tree

1 file changed

+6
-10
lines changed

1 file changed

+6
-10
lines changed

compat/mingw.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,18 +1076,16 @@ char *mingw_getcwd(char *pointer, int len)
10761076
{
10771077
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
10781078
DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
1079+
HANDLE hnd;
10791080

10801081
if (!ret || ret >= ARRAY_SIZE(cwd)) {
10811082
errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
10821083
return NULL;
10831084
}
1084-
ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
1085-
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
1086-
HANDLE hnd = CreateFileW(cwd, 0,
1087-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1088-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1089-
if (hnd == INVALID_HANDLE_VALUE)
1090-
return NULL;
1085+
hnd = CreateFileW(cwd, 0,
1086+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1087+
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1088+
if (hnd != INVALID_HANDLE_VALUE) {
10911089
ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
10921090
CloseHandle(hnd);
10931091
if (!ret || ret >= ARRAY_SIZE(wpointer))
@@ -1096,9 +1094,7 @@ char *mingw_getcwd(char *pointer, int len)
10961094
return NULL;
10971095
return pointer;
10981096
}
1099-
if (!ret || ret >= ARRAY_SIZE(wpointer))
1100-
return NULL;
1101-
if (xwcstoutf(pointer, wpointer, len) < 0)
1097+
if (xwcstoutf(pointer, cwd, len) < 0)
11021098
return NULL;
11031099
convert_slashes(pointer);
11041100
return pointer;

0 commit comments

Comments
 (0)