Skip to content

Commit 1e64d18

Browse files
committed
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 f049d37 commit 1e64d18

File tree

1 file changed

+6
-10
lines changed

1 file changed

+6
-10
lines changed

compat/mingw.c

+6-10
Original file line numberDiff line numberDiff line change
@@ -1038,18 +1038,16 @@ char *mingw_getcwd(char *pointer, int len)
10381038
{
10391039
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
10401040
DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
1041+
HANDLE hnd;
10411042

10421043
if (!ret || ret >= ARRAY_SIZE(cwd)) {
10431044
errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
10441045
return NULL;
10451046
}
1046-
ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
1047-
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
1048-
HANDLE hnd = CreateFileW(cwd, 0,
1049-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1050-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1051-
if (hnd == INVALID_HANDLE_VALUE)
1052-
return NULL;
1047+
hnd = CreateFileW(cwd, 0,
1048+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1049+
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1050+
if (hnd != INVALID_HANDLE_VALUE) {
10531051
ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
10541052
CloseHandle(hnd);
10551053
if (!ret || ret >= ARRAY_SIZE(wpointer))
@@ -1058,9 +1056,7 @@ char *mingw_getcwd(char *pointer, int len)
10581056
return NULL;
10591057
return pointer;
10601058
}
1061-
if (!ret || ret >= ARRAY_SIZE(wpointer))
1062-
return NULL;
1063-
if (xwcstoutf(pointer, wpointer, len) < 0)
1059+
if (xwcstoutf(pointer, cwd, len) < 0)
10641060
return NULL;
10651061
convert_slashes(pointer);
10661062
return pointer;

0 commit comments

Comments
 (0)