summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sanders <spekbukkem@gmail.com>2020-04-10 11:28:56 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-04-10 17:34:05 (GMT)
commit23eafd924a2df8b52d85afc6c448690d885bb784 (patch)
tree2bcb0a3e2ba4b61f85797a01aec0de6f92c4a54f
parent9fadedd637b312089337d73c3ed8447e9f0aa775 (diff)
downloadgit-23eafd924a2df8b52d85afc6c448690d885bb784.zip
git-23eafd924a2df8b52d85afc6c448690d885bb784.tar.gz
git-23eafd924a2df8b52d85afc6c448690d885bb784.tar.bz2
mingw: cope with the Isilon network file system
On certain network filesystems (currently encountered with Isilon, but in theory more network storage solutions could be causing the same issue), when the directory in question is missing, `raceproof_create_file()` fails with an `ERROR_INVALID_PARAMETER` instead of an `ERROR_PATH_NOT_FOUND`. Since it is highly unlikely that we produce such an error by mistake (the parameters we pass are fairly benign), we can be relatively certain that the directory is missing in this instance. So let's just translate that error automagically. This fixes https://github.com/git-for-windows/git/issues/1345. Signed-off-by: Nathan Sanders <spekbukkem@gmail.com> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--compat/mingw.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/compat/mingw.c b/compat/mingw.c
index d14065d..0c71a22 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -460,8 +460,21 @@ static int mingw_open_append(wchar_t const *wfilename, int oflags, ...)
handle = CreateFileW(wfilename, FILE_APPEND_DATA,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL, create, FILE_ATTRIBUTE_NORMAL, NULL);
- if (handle == INVALID_HANDLE_VALUE)
- return errno = err_win_to_posix(GetLastError()), -1;
+ if (handle == INVALID_HANDLE_VALUE) {
+ DWORD err = GetLastError();
+
+ /*
+ * Some network storage solutions (e.g. Isilon) might return
+ * ERROR_INVALID_PARAMETER instead of expected error
+ * ERROR_PATH_NOT_FOUND, which results in an unknown error. If
+ * so, let's turn the error to ERROR_PATH_NOT_FOUND instead.
+ */
+ if (err == ERROR_INVALID_PARAMETER)
+ err = ERROR_PATH_NOT_FOUND;
+
+ errno = err_win_to_posix(err);
+ return -1;
+ }
/*
* No O_APPEND here, because the CRT uses it only to reset the