From e222c3ae7238ad0417665883eaafedf63ea513fb Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Thu, 9 Jun 2016 12:50:53 -0700 Subject: [PATCH] dll: fuse: implementation checkpoint --- src/dll/fuse/fuseintf.c | 32 ++++++++++++++++++++++++++++---- src/dll/fuse/library.h | 1 + 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/dll/fuse/fuseintf.c b/src/dll/fuse/fuseintf.c index 45685bec..b046ecf3 100644 --- a/src/dll/fuse/fuseintf.c +++ b/src/dll/fuse/fuseintf.c @@ -22,8 +22,10 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem, { struct fuse_context *context; struct fsp_fuse_context_header *context_header; + char *PosixPath = 0; UINT32 Uid = -1, Gid = -1; - HANDLE Token; + PWSTR FileName = 0; + HANDLE Token = 0; union { TOKEN_USER V; @@ -40,14 +42,25 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem, NTSTATUS Result; if (FspFsctlTransactCreateKind == Request->Kind) + { + FileName = (PWSTR)Request->Buffer; Token = (HANDLE)Request->Req.Create.AccessToken; + } else if (FspFsctlTransactSetInformationKind == Request->Kind && 10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass) + { + FileName = (PWSTR)(Request->Buffer + Request->Req.SetInformation.Info.Rename.NewFileName.Offset); Token = (HANDLE)Request->Req.SetInformation.Info.Rename.AccessToken; + } else if (FspFsctlTransactSetSecurityKind == Request->Kind) Token = (HANDLE)Request->Req.SetSecurity.AccessToken; - else - Token = 0; + + if (0 != FileName) + { + Result = FspPosixMapWindowsToPosixPath(FileName, &PosixPath); + if (!NT_SUCCESS(Result)) + goto exit; + } if (0 != Token) { @@ -111,6 +124,10 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem, goto exit; } + Result = FspFileSystemOpEnter(FileSystem, Request, Response); + if (!NT_SUCCESS(Result)) + goto exit; + context->fuse = FileSystem->UserContext; context->uid = Uid; context->gid = Gid; @@ -118,8 +135,9 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem, context_header = (PVOID)((PUINT8)context - sizeof *context_header); context_header->Request = Request; context_header->Response = Response; + context_header->PosixPath = PosixPath; - Result = FspFileSystemOpEnter(FileSystem, Request, Response); + Result = STATUS_SUCCESS; exit: if (UserInfo != &UserInfoBuf.V) @@ -128,6 +146,9 @@ exit: if (GroupInfo != &GroupInfoBuf.V) MemFree(GroupInfo); + if (!NT_SUCCESS(Result) && 0 != PosixPath) + FspPosixDeletePath(PosixPath); + return Result; } @@ -143,8 +164,11 @@ NTSTATUS fsp_fuse_op_leave(FSP_FILE_SYSTEM *FileSystem, context->gid = -1; context_header = (PVOID)((PUINT8)context - sizeof *context_header); + if (0 != context_header->PosixPath) + FspPosixDeletePath(context_header->PosixPath); context_header->Request = 0; context_header->Response = 0; + context_header->PosixPath = 0; FspFileSystemOpLeave(FileSystem, Request, Response); diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h index f6c45cee..5d40d36b 100644 --- a/src/dll/fuse/library.h +++ b/src/dll/fuse/library.h @@ -41,6 +41,7 @@ struct fsp_fuse_context_header { FSP_FSCTL_TRANSACT_REQ *Request; FSP_FSCTL_TRANSACT_RSP *Response; + char *PosixPath; __declspec(align(MEMORY_ALLOCATION_ALIGNMENT)) UINT8 ContextBuf[]; };