diff options
author | Johannes Sixt <j6t@kdbg.org> | 2014-11-16 22:06:26 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-11-17 08:45:50 -0800 |
commit | ba6fad02b6cbbfbf5acf3303b4d8ddfd8624fdb2 (patch) | |
tree | a60a2929fd97c96f05f7122df9667a7a727a81d1 | |
parent | 7fa1365c54c28b3cd9375539f381b54061a1880d (diff) | |
download | git-ba6fad02b6cbbfbf5acf3303b4d8ddfd8624fdb2.tar.gz git-ba6fad02b6cbbfbf5acf3303b4d8ddfd8624fdb2.tar.xz |
Windows: correct detection of EISDIR in mingw_open()
According to the Linux open(2) man page, open() must return EISDIR
if a directory was attempted to be opened for writing. Our emulation
in mingw_open() does not get this right: it checks only for O_CREAT.
Fix it to check for a write request.
This fixes a failure in reflog handling, which opens files with
O_APPEND|O_WRONLY, but without O_CREAT, and expects EISDIR when the
named file happens to be a directory.
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | compat/mingw.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index c5c37e53c..70f3191a4 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -312,7 +312,7 @@ int mingw_open (const char *filename, int oflags, ...) return -1; fd = _wopen(wfilename, oflags, mode); - if (fd < 0 && (oflags & O_CREAT) && errno == EACCES) { + if (fd < 0 && (oflags & O_ACCMODE) != O_RDONLY && errno == EACCES) { DWORD attrs = GetFileAttributesW(wfilename); if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY)) errno = EISDIR; |