mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-07 20:42:09 -05:00
sys: fix issue #364
This commit is contained in:
parent
d0d67998c1
commit
33c6e7ee61
@ -1051,8 +1051,21 @@ NTSTATUS FspFsvolCreateComplete(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* open the FileNode */
|
/* open the FileNode */
|
||||||
|
UINT32 AdditionalGrantedAccess = 0;
|
||||||
|
switch ((IrpSp->Parameters.Create.Options >> 24) & 0xff)
|
||||||
|
{
|
||||||
|
case FILE_OVERWRITE: case FILE_OVERWRITE_IF:
|
||||||
|
/* Additional granted access for share check. Fixes GitHub issue #364. */
|
||||||
|
AdditionalGrantedAccess = FILE_WRITE_DATA;
|
||||||
|
break;
|
||||||
|
case FILE_SUPERSEDE:
|
||||||
|
/* Additional granted access for share check. Fixes GitHub issue #364. */
|
||||||
|
AdditionalGrantedAccess = DELETE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
Result = FspFileNodeOpen(FileNode, FileObject,
|
Result = FspFileNodeOpen(FileNode, FileObject,
|
||||||
Response->Rsp.Create.Opened.GrantedAccess, IrpSp->Parameters.Create.ShareAccess,
|
Response->Rsp.Create.Opened.GrantedAccess, AdditionalGrantedAccess,
|
||||||
|
IrpSp->Parameters.Create.ShareAccess,
|
||||||
&OpenedFileNode, &SharingViolationReason);
|
&OpenedFileNode, &SharingViolationReason);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
{
|
{
|
||||||
|
@ -1556,7 +1556,7 @@ VOID FspFileNodeReleaseForeign(FSP_FILE_NODE *FileNode)
|
|||||||
ExReleaseResourceLite(FileNode->Header.Resource);
|
ExReleaseResourceLite(FileNode->Header.Resource);
|
||||||
}
|
}
|
||||||
NTSTATUS FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
NTSTATUS FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
||||||
UINT32 GrantedAccess, UINT32 ShareAccess,
|
UINT32 GrantedAccess, UINT32 AdditionalGrantedAccess, UINT32 ShareAccess,
|
||||||
FSP_FILE_NODE **POpenedFileNode, PULONG PSharingViolationReason);
|
FSP_FILE_NODE **POpenedFileNode, PULONG PSharingViolationReason);
|
||||||
VOID FspFileNodeCleanup(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, PULONG PCleanupFlags);
|
VOID FspFileNodeCleanup(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, PULONG PCleanupFlags);
|
||||||
VOID FspFileNodeCleanupFlush(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject);
|
VOID FspFileNodeCleanupFlush(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject);
|
||||||
|
@ -38,7 +38,7 @@ VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
|||||||
VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
||||||
NTSTATUS FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
NTSTATUS FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
||||||
UINT32 GrantedAccess, UINT32 ShareAccess,
|
UINT32 GrantedAccess, UINT32 AdditionalGrantedAccess, UINT32 ShareAccess,
|
||||||
FSP_FILE_NODE **POpenedFileNode, PULONG PSharingViolationReason);
|
FSP_FILE_NODE **POpenedFileNode, PULONG PSharingViolationReason);
|
||||||
VOID FspFileNodeCleanup(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, PULONG PCleanupFlags);
|
VOID FspFileNodeCleanup(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, PULONG PCleanupFlags);
|
||||||
VOID FspFileNodeCleanupFlush(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject);
|
VOID FspFileNodeCleanupFlush(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject);
|
||||||
@ -588,7 +588,7 @@ VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner)
|
|||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
NTSTATUS FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
||||||
UINT32 GrantedAccess, UINT32 ShareAccess,
|
UINT32 GrantedAccess, UINT32 AdditionalGrantedAccess, UINT32 ShareAccess,
|
||||||
FSP_FILE_NODE **POpenedFileNode, PULONG PSharingViolationReason)
|
FSP_FILE_NODE **POpenedFileNode, PULONG PSharingViolationReason)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -711,6 +711,14 @@ NTSTATUS FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* share access check */
|
/* share access check */
|
||||||
|
if (0 != AdditionalGrantedAccess)
|
||||||
|
{
|
||||||
|
/* Additional share check for FILE_OVERWRITE*, FILE_SUPERSEDE. Fixes GitHub issue #364. */
|
||||||
|
Result = IoCheckShareAccess(GrantedAccess | AdditionalGrantedAccess, ShareAccess, FileObject,
|
||||||
|
&OpenedFileNode->ShareAccess, FALSE);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
Result = IoCheckShareAccess(GrantedAccess, ShareAccess, FileObject,
|
Result = IoCheckShareAccess(GrantedAccess, ShareAccess, FileObject,
|
||||||
&OpenedFileNode->ShareAccess, TRUE);
|
&OpenedFileNode->ShareAccess, TRUE);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
|
@ -1131,6 +1131,45 @@ void create_share_dotest(ULONG Flags, PWSTR Prefix)
|
|||||||
ASSERT(ERROR_SHARING_VIOLATION == GetLastError());
|
ASSERT(ERROR_SHARING_VIOLATION == GetLastError());
|
||||||
|
|
||||||
CloseHandle(Handle1);
|
CloseHandle(Handle1);
|
||||||
|
|
||||||
|
/* GitHub issue #364 */
|
||||||
|
Handle1 = CreateFileW(FilePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE != Handle1);
|
||||||
|
Handle2 = CreateFileW(FilePath, GENERIC_READ, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE == Handle2);
|
||||||
|
ASSERT(ERROR_SHARING_VIOLATION == GetLastError());
|
||||||
|
CloseHandle(Handle1);
|
||||||
|
|
||||||
|
/* from winfstest */
|
||||||
|
Handle1 = CreateFileW(FilePath, GENERIC_READ, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE != Handle1);
|
||||||
|
Handle2 = CreateFileW(FilePath, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE == Handle2);
|
||||||
|
ASSERT(ERROR_SHARING_VIOLATION == GetLastError());
|
||||||
|
Handle2 = CreateFileW(FilePath, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE != Handle2);
|
||||||
|
CloseHandle(Handle2);
|
||||||
|
Handle2 = CreateFileW(FilePath, DELETE, FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE == Handle2);
|
||||||
|
ASSERT(ERROR_SHARING_VIOLATION == GetLastError());
|
||||||
|
Handle2 = CreateFileW(FilePath, DELETE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE == Handle2);
|
||||||
|
ASSERT(ERROR_SHARING_VIOLATION == GetLastError());
|
||||||
|
CloseHandle(Handle1);
|
||||||
|
|
||||||
|
/* from winfstest */
|
||||||
|
Handle1 = CreateFileW(FilePath, DELETE, FILE_SHARE_DELETE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE != Handle1);
|
||||||
|
Handle2 = CreateFileW(FilePath, GENERIC_WRITE, FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE == Handle2);
|
||||||
|
ASSERT(ERROR_SHARING_VIOLATION == GetLastError());
|
||||||
|
Handle2 = CreateFileW(FilePath, DELETE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE == Handle2);
|
||||||
|
ASSERT(ERROR_SHARING_VIOLATION == GetLastError());
|
||||||
|
Handle2 = CreateFileW(FilePath, DELETE, FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);
|
||||||
|
ASSERT(INVALID_HANDLE_VALUE != Handle2);
|
||||||
|
CloseHandle(Handle2);
|
||||||
|
CloseHandle(Handle1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle1 = CreateFileW(FilePath,
|
Handle1 = CreateFileW(FilePath,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user