forked from aniani/vim
patch 8.0.1798: MS-Windows: file considered read-only too often
Problem: MS-Windows: file considered read-only when another program has opened it. Solution: Pass file sharing flag to CreateFile(). (Linwei, closes #2860)
This commit is contained in:
@@ -6847,7 +6847,6 @@ default_shell(void)
|
|||||||
mch_access(char *n, int p)
|
mch_access(char *n, int p)
|
||||||
{
|
{
|
||||||
HANDLE hFile;
|
HANDLE hFile;
|
||||||
DWORD am;
|
|
||||||
int retval = -1; /* default: fail */
|
int retval = -1; /* default: fail */
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
WCHAR *wn = NULL;
|
WCHAR *wn = NULL;
|
||||||
@@ -6931,16 +6930,22 @@ mch_access(char *n, int p)
|
|||||||
}
|
}
|
||||||
else
|
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
|
/* Trying to open the file for the required access does ACL, read-only
|
||||||
* network share, and file attribute checks. */
|
* network share, and file attribute checks. */
|
||||||
am = ((p & W_OK) ? GENERIC_WRITE : 0)
|
DWORD access_mode = ((p & W_OK) ? GENERIC_WRITE : 0)
|
||||||
| ((p & R_OK) ? GENERIC_READ : 0);
|
| ((p & R_OK) ? GENERIC_READ : 0);
|
||||||
|
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
if (wn != NULL)
|
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
|
else
|
||||||
#endif
|
#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)
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
goto getout;
|
goto getout;
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
|
@@ -761,6 +761,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1798,
|
||||||
/**/
|
/**/
|
||||||
1797,
|
1797,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user