Skip to content

Commit eff4264

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 787bfe4 commit eff4264

File tree

1 file changed

+7
-11
lines changed

1 file changed

+7
-11
lines changed

compat/mingw.c

+7-11
Original file line numberDiff line numberDiff line change
@@ -1122,18 +1122,16 @@ char *mingw_getcwd(char *pointer, int len)
11221122
{
11231123
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
11241124
DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
1125+
HANDLE hnd;
11251126

11261127
if (!ret || ret >= ARRAY_SIZE(cwd)) {
11271128
errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
11281129
return NULL;
11291130
}
1130-
ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
1131-
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
1132-
HANDLE hnd = CreateFileW(cwd, 0,
1133-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1134-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1135-
if (hnd == INVALID_HANDLE_VALUE)
1136-
return NULL;
1131+
hnd = CreateFileW(cwd, 0,
1132+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1133+
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1134+
if (hnd != INVALID_HANDLE_VALUE) {
11371135
ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
11381136
CloseHandle(hnd);
11391137
if (!ret || ret >= ARRAY_SIZE(wpointer))
@@ -1142,13 +1140,11 @@ char *mingw_getcwd(char *pointer, int len)
11421140
return NULL;
11431141
return pointer;
11441142
}
1145-
if (!ret || ret >= ARRAY_SIZE(wpointer))
1146-
return NULL;
1147-
if (GetFileAttributesW(wpointer) == INVALID_FILE_ATTRIBUTES) {
1143+
if (GetFileAttributesW(cwd) == INVALID_FILE_ATTRIBUTES) {
11481144
errno = ENOENT;
11491145
return NULL;
11501146
}
1151-
if (xwcstoutf(pointer, wpointer, len) < 0)
1147+
if (xwcstoutf(pointer, cwd, len) < 0)
11521148
return NULL;
11531149
convert_slashes(pointer);
11541150
return pointer;

0 commit comments

Comments
 (0)