mirror of
https://github.com/git/git.git
synced 2026-01-09 01:34:00 +00:00
mingw: special-case open(symlink, O_CREAT | O_EXCL)
The `_wopen()` function would gladly follow a symbolic link to a non-existent file and create it when given above-mentioned flags. Git expects the `open()` call to fail, though. So let's add yet another work-around to pretend that Windows behaves according to POSIX, see: https://pubs.opengroup.org/onlinepubs/007904875/functions/open.html#:~:text=If%20O_CREAT%20and%20O_EXCL%20are,set%2C%20the%20result%20is%20undefined. This is required to let t4115.8(--reject removes .rej symlink if it exists) pass on Windows when enabling the MSYS2 runtime's symbolic link support. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
b90a926371
commit
6fa50cc4a1
@@ -629,6 +629,7 @@ int mingw_open (const char *filename, int oflags, ...)
|
||||
int fd, create = (oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL);
|
||||
wchar_t wfilename[MAX_PATH];
|
||||
open_fn_t open_fn;
|
||||
WIN32_FILE_ATTRIBUTE_DATA fdata;
|
||||
|
||||
DECLARE_PROC_ADDR(ntdll.dll, NTSTATUS, NTAPI, RtlGetLastNtStatus, void);
|
||||
|
||||
@@ -653,6 +654,19 @@ int mingw_open (const char *filename, int oflags, ...)
|
||||
else if (xutftowcs_path(wfilename, filename) < 0)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* When `symlink` exists and is a symbolic link pointing to a
|
||||
* non-existing file, `_wopen(symlink, O_CREAT | O_EXCL)` would
|
||||
* create that file. Not what we want: Linux would say `EEXIST`
|
||||
* in that instance, which is therefore what Git expects.
|
||||
*/
|
||||
if (create &&
|
||||
GetFileAttributesExW(wfilename, GetFileExInfoStandard, &fdata) &&
|
||||
(fdata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) {
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
|
||||
fd = open_fn(wfilename, oflags, mode);
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user