patch 8.0.1798: MS-Windows: file considered read-only too often v8.0.1798
authorBram Moolenaar <Bram@vim.org>
Sun, 6 May 2018 15:09:38 +0000 (17:09 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 6 May 2018 15:09:38 +0000 (17:09 +0200)
Problem:    MS-Windows: file considered read-only when another program has
            opened it.
Solution:   Pass file sharing flag to CreateFile(). (Linwei, closes #2860)

src/os_win32.c
src/version.c

index a90dc1f79bf5d1c3ead084eb5b5ee2ee798d6d19..602ef8aa2181b7690d50113236b8580f8eac523c 100644 (file)
@@ -6847,7 +6847,6 @@ default_shell(void)
 mch_access(char *n, int p)
 {
     HANDLE     hFile;
-    DWORD      am;
     int                retval = -1;        /* default: fail */
 #ifdef FEAT_MBYTE
     WCHAR      *wn = NULL;
@@ -6931,16 +6930,22 @@ mch_access(char *n, int p)
     }
     else
     {
+       // Don't consider a file read-only if another process has opened it.
+       DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE;
+
        /* Trying to open the file for the required access does ACL, read-only
         * network share, and file attribute checks.  */
-       am = ((p & W_OK) ? GENERIC_WRITE : 0)
-               | ((p & R_OK) ? GENERIC_READ : 0);
+       DWORD access_mode = ((p & W_OK) ? GENERIC_WRITE : 0)
+                                            | ((p & R_OK) ? GENERIC_READ : 0);
+
 #ifdef FEAT_MBYTE
        if (wn != NULL)
-           hFile = CreateFileW(wn, am, 0, NULL, OPEN_EXISTING, 0, NULL);
+           hFile = CreateFileW(wn, access_mode, share_mode,
+                                                NULL, OPEN_EXISTING, 0, NULL);
        else
 #endif
-           hFile = CreateFile(n, am, 0, NULL, OPEN_EXISTING, 0, NULL);
+           hFile = CreateFile(n, access_mode, share_mode,
+                                                NULL, OPEN_EXISTING, 0, NULL);
        if (hFile == INVALID_HANDLE_VALUE)
            goto getout;
        CloseHandle(hFile);
index 5fa69e3cdb50fe43c02d9f27985523b63600b2c1..0f0a1b7d2ebe16040c64814ba1844658525f201d 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1798,
 /**/
     1797,
 /**/