From 0e8d694bddb5c34f1e18912d2cf57e8bbc2d5ec1 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 8 Jun 2016 22:15:24 -0700 Subject: [PATCH] dll: FSP_FILE_SYSTEM_OPERATION_GUARD now returns NTSTATUS --- inc/winfsp/winfsp.h | 22 +++++++++++++--------- src/dll/fs.c | 10 +++++++--- src/dll/fsop.c | 8 ++++++-- src/dll/fuse/fuse.c | 1 + src/dll/fuse/fuseintf.c | 41 ++++++++++++++++++++++++++++++++++++++++- src/dll/fuse/library.h | 5 +++++ 6 files changed, 72 insertions(+), 15 deletions(-) diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 6351dddd..94ed0630 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -50,7 +50,7 @@ extern "C" { * FSP_FILE_SYSTEM_INTERFACE operations. */ typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM; -typedef VOID FSP_FILE_SYSTEM_OPERATION_GUARD(FSP_FILE_SYSTEM *, +typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION_GUARD(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *, FSP_FSCTL_TRANSACT_RSP *); typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *, FSP_FSCTL_TRANSACT_RSP *); @@ -701,18 +701,22 @@ PWSTR FspFileSystemMountPoint(FSP_FILE_SYSTEM *FileSystem) return FileSystem->MountPoint; } static inline -VOID FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem, +NTSTATUS FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) { - if (0 != FileSystem->EnterOperation) - FileSystem->EnterOperation(FileSystem, Request, Response); + if (0 == FileSystem->EnterOperation) + return STATUS_SUCCESS; + + return FileSystem->EnterOperation(FileSystem, Request, Response); } static inline -VOID FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem, +NTSTATUS FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) { - if (0 != FileSystem->LeaveOperation) - FileSystem->LeaveOperation(FileSystem, Request, Response); + if (0 == FileSystem->LeaveOperation) + return STATUS_SUCCESS; + + return FileSystem->LeaveOperation(FileSystem, Request, Response); } static inline VOID FspFileSystemSetOperationGuard(FSP_FILE_SYSTEM *FileSystem, @@ -761,9 +765,9 @@ VOID FspFileSystemSetDebugLog(FSP_FILE_SYSTEM *FileSystem, /* * Operations */ -FSP_API VOID FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem, +FSP_API NTSTATUS FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); -FSP_API VOID FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem, +FSP_API NTSTATUS FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); diff --git a/src/dll/fs.c b/src/dll/fs.c index cffa2dbe..fcce6bbe 100644 --- a/src/dll/fs.c +++ b/src/dll/fs.c @@ -283,10 +283,14 @@ static DWORD WINAPI FspFileSystemDispatcherThread(PVOID FileSystem0) Response->Hint = Request->Hint; if (FspFsctlTransactKindCount > Request->Kind && 0 != FileSystem->Operations[Request->Kind]) { - FspFileSystemEnterOperation(FileSystem, Request, Response); Response->IoStatus.Status = - FileSystem->Operations[Request->Kind](FileSystem, Request, Response); - FspFileSystemLeaveOperation(FileSystem, Request, Response); + FspFileSystemEnterOperation(FileSystem, Request, Response); + if (NT_SUCCESS(Response->IoStatus.Status)) + { + Response->IoStatus.Status = + FileSystem->Operations[Request->Kind](FileSystem, Request, Response); + FspFileSystemLeaveOperation(FileSystem, Request, Response); + } } else Response->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 74ac0a5c..321fa8a0 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -37,7 +37,7 @@ * guarded by a mutually exclusive lock. */ -FSP_API VOID FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem, +FSP_API NTSTATUS FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) { switch (FileSystem->OpGuardStrategy) @@ -68,9 +68,11 @@ FSP_API VOID FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem, AcquireSRWLockExclusive(&FileSystem->OpGuardLock); break; } + + return STATUS_SUCCESS; } -FSP_API VOID FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem, +FSP_API NTSTATUS FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) { switch (FileSystem->OpGuardStrategy) @@ -101,6 +103,8 @@ FSP_API VOID FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem, ReleaseSRWLockExclusive(&FileSystem->OpGuardLock); break; } + + return STATUS_SUCCESS; } static inline diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c index 575388e5..8def439a 100644 --- a/src/dll/fuse/fuse.c +++ b/src/dll/fuse/fuse.c @@ -343,6 +343,7 @@ static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) } f->FileSystem->UserContext = f; + FspFileSystemSetOperationGuard(f->FileSystem, fsp_fuse_op_enter, fsp_fuse_op_leave); FspFileSystemSetDebugLog(f->FileSystem, f->DebugLog); if (L'\0' != f->MountPoint) diff --git a/src/dll/fuse/fuseintf.c b/src/dll/fuse/fuseintf.c index 21f082b7..0c579de9 100644 --- a/src/dll/fuse/fuseintf.c +++ b/src/dll/fuse/fuseintf.c @@ -17,7 +17,7 @@ #include -static NTSTATUS fsp_fuse_intf_set_context(FSP_FILE_SYSTEM *FileSystem, HANDLE Token) +static NTSTATUS fsp_fuse_op_set_context(FSP_FILE_SYSTEM *FileSystem, HANDLE Token) { struct fuse_context *context; UINT32 Uid = -1, Gid = -1; @@ -114,6 +114,33 @@ exit: return Result; } +NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) +{ + NTSTATUS Result; + + Result = FspFileSystemOpEnter(FileSystem, Request, Response); + if (!NT_SUCCESS(Result)) + return Result; + + return fsp_fuse_op_set_context(FileSystem, 0); +} + +NTSTATUS fsp_fuse_op_leave(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) +{ + struct fuse_context *context; + + context = fsp_fuse_get_context(0); + context->fuse = 0; + context->uid = 0; + context->gid = 0; + + FspFileSystemOpLeave(FileSystem, Request, Response); + + return STATUS_SUCCESS; +} + NTSTATUS fsp_fuse_intf_GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_VOLUME_INFO *VolumeInfo) @@ -208,6 +235,18 @@ NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem, PWSTR FileName, BOOLEAN CaseSensitive, UINT32 CreateOptions, PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo) { +#if 0 + struct fuse *f = FileSystem->UserContext; + struct fuse_file_info fi; + char *PosixPath = 0; + int err; + NTSTATUS Result; + + if (0 == f->ops.open) + return STATUS_INVALID_DEVICE_REQUEST; + + err = f->ops.open(PosixPath, &fi); +#endif return STATUS_INVALID_DEVICE_REQUEST; } diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h index bf04ad0c..4111fa71 100644 --- a/src/dll/fuse/library.h +++ b/src/dll/fuse/library.h @@ -37,6 +37,11 @@ struct fuse BOOLEAN fsinit; }; +NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +NTSTATUS fsp_fuse_op_leave(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); + extern FSP_FILE_SYSTEM_INTERFACE fsp_fuse_intf; #endif