mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
sys: FspFsvolFileSystemControlReparsePoint: FSCL_DELETE_REPARSE_POINT
This commit is contained in:
parent
eecca688bc
commit
23eabe5939
@ -134,27 +134,51 @@ static NTSTATUS FspFsvolFileSystemControlReparsePoint(
|
|||||||
|
|
||||||
if (IsWrite)
|
if (IsWrite)
|
||||||
{
|
{
|
||||||
|
ASSERT(
|
||||||
|
FSCTL_SET_REPARSE_POINT == FsControlCode ||
|
||||||
|
FSCTL_DELETE_REPARSE_POINT == FsControlCode);
|
||||||
|
|
||||||
if (0 == InputBuffer || 0 == InputBufferLength)
|
if (0 == InputBuffer || 0 == InputBufferLength)
|
||||||
return STATUS_INVALID_BUFFER_SIZE;
|
return STATUS_INVALID_BUFFER_SIZE;
|
||||||
|
|
||||||
if (0 != OutputBufferLength)
|
if (0 != OutputBufferLength)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (FSP_FSCTL_TRANSACT_REQ_BUFFER_SIZEMAX - (FileNode->FileName.Length + sizeof(WCHAR)) <
|
ReparseData = (PREPARSE_DATA_BUFFER)InputBuffer;
|
||||||
InputBufferLength)
|
|
||||||
return STATUS_IO_REPARSE_DATA_INVALID;
|
|
||||||
|
|
||||||
Result = FsRtlValidateReparsePointBuffer(InputBufferLength, InputBuffer);
|
if (FSCTL_SET_REPARSE_POINT == FsControlCode)
|
||||||
if (!NT_SUCCESS(Result))
|
{
|
||||||
return Result;
|
if (FSP_FSCTL_TRANSACT_REQ_BUFFER_SIZEMAX - (FileNode->FileName.Length + sizeof(WCHAR)) <
|
||||||
|
InputBufferLength)
|
||||||
|
return STATUS_IO_REPARSE_DATA_INVALID;
|
||||||
|
|
||||||
/* NTFS seems to require one of these rights to allow FSCTL_SET_REPARSE_POINT */
|
Result = FsRtlValidateReparsePointBuffer(InputBufferLength, InputBuffer);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((ULONG)FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer) != InputBufferLength &&
|
||||||
|
(ULONG)FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer) != InputBufferLength)
|
||||||
|
return STATUS_IO_REPARSE_DATA_INVALID;
|
||||||
|
|
||||||
|
if (0 != ReparseData->ReparseDataLength)
|
||||||
|
return STATUS_IO_REPARSE_DATA_INVALID;
|
||||||
|
|
||||||
|
if (IO_REPARSE_TAG_RESERVED_ZERO == ReparseData->ReparseTag ||
|
||||||
|
IO_REPARSE_TAG_RESERVED_ONE == ReparseData->ReparseTag)
|
||||||
|
return STATUS_IO_REPARSE_TAG_INVALID;
|
||||||
|
|
||||||
|
if (!IsReparseTagMicrosoft(ReparseData->ReparseTag) &&
|
||||||
|
(ULONG)FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer) != InputBufferLength)
|
||||||
|
return STATUS_IO_REPARSE_DATA_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NTFS seems to require one of these rights to allow FSCTL_{SET,DELETE}_REPARSE_POINT */
|
||||||
if (!FlagOn(FileDesc->GrantedAccess,
|
if (!FlagOn(FileDesc->GrantedAccess,
|
||||||
FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_ATTRIBUTES))
|
FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_ATTRIBUTES))
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
|
|
||||||
ReparseData = (PREPARSE_DATA_BUFFER)InputBuffer;
|
|
||||||
|
|
||||||
if (IO_REPARSE_TAG_SYMLINK == ReparseData->ReparseTag)
|
if (IO_REPARSE_TAG_SYMLINK == ReparseData->ReparseTag)
|
||||||
{
|
{
|
||||||
/* NTFS severely limits symbolic links; we will not do that unless our file system asks */
|
/* NTFS severely limits symbolic links; we will not do that unless our file system asks */
|
||||||
@ -248,6 +272,8 @@ static NTSTATUS FspFsvolFileSystemControlReparsePoint(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
ASSERT(FSCTL_GET_REPARSE_POINT == FsControlCode);
|
||||||
|
|
||||||
if (0 != InputBufferLength)
|
if (0 != InputBufferLength)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user