mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
dll: move STATUS_FILE_IS_A_DIRECTORY collision check to fsop.c from memfs
This commit is contained in:
parent
3e0f2316a7
commit
233904fd51
2
ext/test
2
ext/test
@ -1 +1 @@
|
|||||||
Subproject commit 2d629a427ff1d0f04d2117a414cd7b385ae8b95f
|
Subproject commit feb554380e6daf45fe859789cff62f90eff962df
|
@ -626,9 +626,10 @@ static NTSTATUS FspFileSystemOpCreate_NotFoundCheck(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
Result = FileSystem->Interface->GetSecurityByName(
|
Result = FileSystem->Interface->GetSecurityByName(
|
||||||
FileSystem, (PWSTR)Request->Buffer, &FileAttributes, 0, 0);
|
FileSystem, (PWSTR)Request->Buffer, &FileAttributes, 0, 0);
|
||||||
((PWSTR)Request->Buffer)[Request->Req.Create.NamedStream / sizeof(WCHAR)] = L':';
|
((PWSTR)Request->Buffer)[Request->Req.Create.NamedStream / sizeof(WCHAR)] = L':';
|
||||||
|
if (STATUS_SUCCESS != Result)
|
||||||
|
return STATUS_OBJECT_NAME_NOT_FOUND;
|
||||||
|
|
||||||
if (STATUS_SUCCESS != Result ||
|
if (0 == (FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
|
||||||
FILE_ATTRIBUTE_REPARSE_POINT != (FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
|
|
||||||
return STATUS_OBJECT_NAME_NOT_FOUND;
|
return STATUS_OBJECT_NAME_NOT_FOUND;
|
||||||
|
|
||||||
FileAttributes = FspPathSuffixIndex((PWSTR)Request->Buffer);
|
FileAttributes = FspPathSuffixIndex((PWSTR)Request->Buffer);
|
||||||
@ -644,26 +645,38 @@ static NTSTATUS FspFileSystemOpCreate_CollisionCheck(FSP_FILE_SYSTEM *FileSystem
|
|||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* This handles a Create done via a symlink. The file system has returned
|
* This handles a Create that resulted in STATUS_OBJECT_NAME_COLLISION. We
|
||||||
* STATUS_OBJECT_NAME_COLLISION, but we check to see if the collision is
|
* handle two separate cases:
|
||||||
* due to a reparse point that can be resolved.
|
*
|
||||||
|
* 1) A Create colliding with a directory and the FILE_NON_DIRECTORY_FILE
|
||||||
|
* flag set. We then change the result code to STATUS_FILE_IS_A_DIRECTORY.
|
||||||
|
*
|
||||||
|
* 2) A Create colliding with a symlink (reparse point) that can be resolved.
|
||||||
|
* In this case we resolve the reparse point and return STATUS_REPARSE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
UINT32 FileAttributes;
|
UINT32 FileAttributes;
|
||||||
|
|
||||||
if (0 == FileSystem->Interface->GetSecurityByName ||
|
if (0 == FileSystem->Interface->GetSecurityByName)
|
||||||
0 == FileSystem->Interface->ResolveReparsePoints)
|
return STATUS_OBJECT_NAME_COLLISION;
|
||||||
|
|
||||||
|
Result = FileSystem->Interface->GetSecurityByName(
|
||||||
|
FileSystem, (PWSTR)Request->Buffer, &FileAttributes, 0, 0);
|
||||||
|
if (STATUS_SUCCESS != Result)
|
||||||
|
return STATUS_OBJECT_NAME_COLLISION;
|
||||||
|
|
||||||
|
if ((Request->Req.Create.CreateOptions & FILE_NON_DIRECTORY_FILE) &&
|
||||||
|
(FileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||||
|
return STATUS_FILE_IS_A_DIRECTORY;
|
||||||
|
|
||||||
|
if (0 == FileSystem->Interface->ResolveReparsePoints)
|
||||||
return STATUS_OBJECT_NAME_COLLISION;
|
return STATUS_OBJECT_NAME_COLLISION;
|
||||||
|
|
||||||
if (Request->Req.Create.CreateOptions & FILE_OPEN_REPARSE_POINT)
|
if (Request->Req.Create.CreateOptions & FILE_OPEN_REPARSE_POINT)
|
||||||
return STATUS_OBJECT_NAME_COLLISION;
|
return STATUS_OBJECT_NAME_COLLISION;
|
||||||
|
|
||||||
Result = FileSystem->Interface->GetSecurityByName(
|
if (0 == (FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
|
||||||
FileSystem, (PWSTR)Request->Buffer, &FileAttributes, 0, 0);
|
|
||||||
if (STATUS_SUCCESS != Result ||
|
|
||||||
FILE_ATTRIBUTE_REPARSE_POINT !=
|
|
||||||
(FileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT)))
|
|
||||||
return STATUS_OBJECT_NAME_COLLISION;
|
return STATUS_OBJECT_NAME_COLLISION;
|
||||||
|
|
||||||
FileAttributes = FspPathSuffixIndex((PWSTR)Request->Buffer);
|
FileAttributes = FspPathSuffixIndex((PWSTR)Request->Buffer);
|
||||||
|
@ -470,13 +470,7 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
|
|
||||||
FileNode = MemfsFileNodeMapGet(Memfs->FileNodeMap, FileName);
|
FileNode = MemfsFileNodeMapGet(Memfs->FileNodeMap, FileName);
|
||||||
if (0 != FileNode)
|
if (0 != FileNode)
|
||||||
{
|
return STATUS_OBJECT_NAME_COLLISION;
|
||||||
if ((CreateOptions & FILE_NON_DIRECTORY_FILE) &&
|
|
||||||
0 != (FileNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
|
||||||
return STATUS_FILE_IS_A_DIRECTORY;
|
|
||||||
else
|
|
||||||
return STATUS_OBJECT_NAME_COLLISION;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!MemfsFileNodeMapGetParent(Memfs->FileNodeMap, FileName, &Result))
|
if (!MemfsFileNodeMapGetParent(Memfs->FileNodeMap, FileName, &Result))
|
||||||
return Result;
|
return Result;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user