Re: [PATCH 1/5] mingw: do resolve symlinks in `getcwd()`
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Dec 17, 2025, 14:44 UTC
- Message-ID
- <aULBssdzMOw449HI@pks.im>
- In-Reply-To
- <1928738b464915e3fb796145688bbfcfcc0fee3c.1765899229.git.gitgitgadget@gmail.com>
On Tue, Dec 16, 2025 at 03:33:45PM +0000, Johannes Schindelin via GitGitGadget wrote:
Show 28 quoted lines
> diff --git a/compat/mingw.c b/compat/mingw.c
> index ba1b7b6dd1..7215b127cc 100644
> --- a/compat/mingw.c
> +++ b/compat/mingw.c
> @@ -1251,18 +1251,16 @@ char *mingw_getcwd(char *pointer, int len)
> {
> wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
> DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
> + HANDLE hnd;
>
> if (!ret || ret >= ARRAY_SIZE(cwd)) {
> errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
> return NULL;
> }
> - ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
> - if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
> - HANDLE hnd = CreateFileW(cwd, 0,
> - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
> - OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
> - if (hnd == INVALID_HANDLE_VALUE)
> - return NULL;
> + hnd = CreateFileW(cwd, 0,
> + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
> + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
> + if (hnd != INVALID_HANDLE_VALUE) {
> ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
> CloseHandle(hnd);
> if (!ret || ret >= ARRAY_SIZE(wpointer))Okay. Due to the change we now also try calling `GetFileAttributesW()` in case `CreateFileW()` fails, which wasn't the case before. But I'd consider that to be a win -- if we cannot figure out the final path name, then we can at least return the unresolved current working directory.
Patrick
Show 16 quoted lines
> @@ -1271,13 +1269,11 @@ char *mingw_getcwd(char *pointer, int len)
> return NULL;
> return pointer;
> }
> - if (!ret || ret >= ARRAY_SIZE(wpointer))
> - return NULL;
> - if (GetFileAttributesW(wpointer) == INVALID_FILE_ATTRIBUTES) {
> + if (GetFileAttributesW(cwd) == INVALID_FILE_ATTRIBUTES) {
> errno = ENOENT;
> return NULL;
> }
> - if (xwcstoutf(pointer, wpointer, len) < 0)
> + if (xwcstoutf(pointer, cwd, len) < 0)
> return NULL;
> convert_slashes(pointer);
> return pointer;