Skip to content

Commit 15a80e2

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 471ccd3 commit 15a80e2

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
@@ -1237,18 +1237,16 @@ char *mingw_getcwd(char *pointer, int len)
12371237
{
12381238
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
12391239
DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
1240+
HANDLE hnd;
12401241

12411242
if (!ret || ret >= ARRAY_SIZE(cwd)) {
12421243
errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
12431244
return NULL;
12441245
}
1245-
ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
1246-
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
1247-
HANDLE hnd = CreateFileW(cwd, 0,
1248-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1249-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1250-
if (hnd == INVALID_HANDLE_VALUE)
1251-
return NULL;
1246+
hnd = CreateFileW(cwd, 0,
1247+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1248+
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1249+
if (hnd != INVALID_HANDLE_VALUE) {
12521250
ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
12531251
CloseHandle(hnd);
12541252
if (!ret || ret >= ARRAY_SIZE(wpointer))
@@ -1257,13 +1255,11 @@ char *mingw_getcwd(char *pointer, int len)
12571255
return NULL;
12581256
return pointer;
12591257
}
1260-
if (!ret || ret >= ARRAY_SIZE(wpointer))
1261-
return NULL;
1262-
if (GetFileAttributesW(wpointer) == INVALID_FILE_ATTRIBUTES) {
1258+
if (GetFileAttributesW(cwd) == INVALID_FILE_ATTRIBUTES) {
12631259
errno = ENOENT;
12641260
return NULL;
12651261
}
1266-
if (xwcstoutf(pointer, wpointer, len) < 0)
1262+
if (xwcstoutf(pointer, cwd, len) < 0)
12671263
return NULL;
12681264
convert_slashes(pointer);
12691265
return pointer;

0 commit comments

Comments
 (0)