Skip to content

Commit 65bfabd

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 2bc31a0 commit 65bfabd

File tree

1 file changed

+7
-11
lines changed

1 file changed

+7
-11
lines changed

compat/mingw.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,18 +1144,16 @@ char *mingw_getcwd(char *pointer, int len)
11441144
{
11451145
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
11461146
DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
1147+
HANDLE hnd;
11471148

11481149
if (!ret || ret >= ARRAY_SIZE(cwd)) {
11491150
errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
11501151
return NULL;
11511152
}
1152-
ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
1153-
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
1154-
HANDLE hnd = CreateFileW(cwd, 0,
1155-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1156-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1157-
if (hnd == INVALID_HANDLE_VALUE)
1158-
return NULL;
1153+
hnd = CreateFileW(cwd, 0,
1154+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1155+
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1156+
if (hnd != INVALID_HANDLE_VALUE) {
11591157
ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
11601158
CloseHandle(hnd);
11611159
if (!ret || ret >= ARRAY_SIZE(wpointer))
@@ -1164,13 +1162,11 @@ char *mingw_getcwd(char *pointer, int len)
11641162
return NULL;
11651163
return pointer;
11661164
}
1167-
if (!ret || ret >= ARRAY_SIZE(wpointer))
1168-
return NULL;
1169-
if (GetFileAttributesW(wpointer) == INVALID_FILE_ATTRIBUTES) {
1165+
if (GetFileAttributesW(cwd) == INVALID_FILE_ATTRIBUTES) {
11701166
errno = ENOENT;
11711167
return NULL;
11721168
}
1173-
if (xwcstoutf(pointer, wpointer, len) < 0)
1169+
if (xwcstoutf(pointer, cwd, len) < 0)
11741170
return NULL;
11751171
convert_slashes(pointer);
11761172
return pointer;

0 commit comments

Comments
 (0)