This commit is contained in:
Bill Zissimopoulos 2016-01-03 22:16:17 -08:00
parent aa04436d5e
commit 2a1fc2a83d

View File

@ -6,6 +6,15 @@
#include <dll/library.h> #include <dll/library.h>
static inline
BOOLEAN FspIsRootDirectory(PWSTR FileName)
{
for (PWSTR Pointer = FileName; *Pointer; Pointer++)
if (L'\\' != *Pointer)
return FALSE;
return TRUE;
}
static inline static inline
NTSTATUS FspCreateCheck(FSP_FILE_SYSTEM *FileSystem, NTSTATUS FspCreateCheck(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck,
@ -31,6 +40,9 @@ NTSTATUS FspCreateCheck(FSP_FILE_SYSTEM *FileSystem,
static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request) FSP_FSCTL_TRANSACT_REQ *Request)
{ {
if (FspIsRootDirectory((PWSTR)Request->Buffer))
return STATUS_ACCESS_DENIED;
NTSTATUS Result; NTSTATUS Result;
DWORD GrantedAccess; DWORD GrantedAccess;
FSP_FILE_NODE *FileNode; FSP_FILE_NODE *FileNode;
@ -127,6 +139,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
if (Create) if (Create)
{ {
if (FspIsRootDirectory((PWSTR)Request->Buffer))
return STATUS_ACCESS_DENIED;
Result = FspCreateCheck(FileSystem, Request, FALSE, &GrantedAccess); Result = FspCreateCheck(FileSystem, Request, FALSE, &GrantedAccess);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result);
@ -161,6 +176,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN Supersede) FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN Supersede)
{ {
if (FspIsRootDirectory((PWSTR)Request->Buffer))
return STATUS_ACCESS_DENIED;
NTSTATUS Result; NTSTATUS Result;
DWORD GrantedAccess; DWORD GrantedAccess;
FSP_FILE_NODE *FileNode; FSP_FILE_NODE *FileNode;
@ -172,9 +190,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem,
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result);
GrantedAccess &= Supersede ? if (0 == (Request->Req.Create.DesiredAccess & MAXIMUM_ALLOWED))
(~DELETE | (Request->Req.Create.DesiredAccess & DELETE)) : GrantedAccess &= Supersede ?
(~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA)); (~DELETE | (Request->Req.Create.DesiredAccess & DELETE)) :
(~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA));
Result = FileSystem->Interface->FileOverwrite(FileSystem, Request, &FileNode); Result = FileSystem->Interface->FileOverwrite(FileSystem, Request, &FileNode);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
@ -202,6 +221,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem,
static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request) FSP_FSCTL_TRANSACT_REQ *Request)
{ {
if (FspIsRootDirectory((PWSTR)Request->Buffer))
return STATUS_ACCESS_DENIED;
NTSTATUS Result; NTSTATUS Result;
DWORD GrantedAccess; DWORD GrantedAccess;
FSP_FILE_NODE *FileNode; FSP_FILE_NODE *FileNode;
@ -218,7 +240,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste
Create = TRUE; Create = TRUE;
} }
else else
GrantedAccess &= ~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA); {
if (0 == (Request->Req.Create.DesiredAccess & MAXIMUM_ALLOWED))
GrantedAccess &= ~FILE_WRITE_DATA | (Request->Req.Create.DesiredAccess & FILE_WRITE_DATA);
}
if (!Create) if (!Create)
{ {