From 7401481d428f1ce934cfa574b1737e223bcfe1ec Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 13 Sep 2016 14:36:40 -0700 Subject: [PATCH] dll: fuse: allow opening of reparse points --- src/dll/fuse/fuse_intf.c | 30 ++++++++++++++++++++++++++++++ src/dll/fuse/library.h | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/dll/fuse/fuse_intf.c b/src/dll/fuse/fuse_intf.c index 4ad29b75..6ae62434 100644 --- a/src/dll/fuse/fuse_intf.c +++ b/src/dll/fuse/fuse_intf.c @@ -847,6 +847,7 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem, filedesc->PosixPath = contexthdr->PosixPath; filedesc->IsDirectory = !!(FileInfoBuf.FileAttributes & FILE_ATTRIBUTE_DIRECTORY); + filedesc->IsReparsePoint = FALSE; filedesc->OpenFlags = fi.flags; filedesc->FileHandle = fi.fh; filedesc->DirBuffer = 0; @@ -934,6 +935,11 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem, Result = STATUS_SUCCESS; } } + else if (FileInfoBuf.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) + { + fi.fh = -1; + Result = STATUS_SUCCESS; + } else { if (0 != f->ops.open) @@ -961,6 +967,7 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem, filedesc->PosixPath = contexthdr->PosixPath; filedesc->IsDirectory = !!(FileInfoBuf.FileAttributes & FILE_ATTRIBUTE_DIRECTORY); + filedesc->IsReparsePoint = !!(FileInfoBuf.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT); filedesc->OpenFlags = fi.flags; filedesc->FileHandle = fi.fh; filedesc->DirBuffer = 0; @@ -990,6 +997,9 @@ static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem, int err; NTSTATUS Result; + if (filedesc->IsDirectory || filedesc->IsReparsePoint) + return STATUS_ACCESS_DENIED; + if (0 != f->ops.ftruncate) { memset(&fi, 0, sizeof fi); @@ -1069,6 +1079,10 @@ static VOID fsp_fuse_intf_Close(FSP_FILE_SYSTEM *FileSystem, if (0 != f->ops.releasedir) f->ops.releasedir(filedesc->PosixPath, &fi); } + else if (filedesc->IsReparsePoint) + { + /* reparse points are not opened, nothing to do! */ + } else { if (0 != f->ops.flush) @@ -1094,6 +1108,9 @@ static NTSTATUS fsp_fuse_intf_Read(FSP_FILE_SYSTEM *FileSystem, int bytes; NTSTATUS Result; + if (filedesc->IsDirectory || filedesc->IsReparsePoint) + return STATUS_ACCESS_DENIED; + if (0 == f->ops.read) return STATUS_INVALID_DEVICE_REQUEST; @@ -1131,6 +1148,9 @@ static NTSTATUS fsp_fuse_intf_Write(FSP_FILE_SYSTEM *FileSystem, int bytes; NTSTATUS Result; + if (filedesc->IsDirectory || filedesc->IsReparsePoint) + return STATUS_ACCESS_DENIED; + if (0 == f->ops.write) return STATUS_INVALID_DEVICE_REQUEST; @@ -1203,6 +1223,8 @@ static NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem, Result = fsp_fuse_ntstatus_from_errno(f->env, err); } } + else if (filedesc->IsReparsePoint) + Result = STATUS_ACCESS_DENIED; else { if (0 != f->ops.fsync) @@ -1329,6 +1351,9 @@ static NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem, int err; NTSTATUS Result; + if (filedesc->IsDirectory || filedesc->IsReparsePoint) + return STATUS_ACCESS_DENIED; + if (0 == f->ops.ftruncate && 0 == f->ops.truncate) return STATUS_INVALID_DEVICE_REQUEST; @@ -1644,6 +1669,9 @@ static NTSTATUS fsp_fuse_intf_ReadDirectory(FSP_FILE_SYSTEM *FileSystem, int err; NTSTATUS Result; + if (!filedesc->IsDirectory) + return STATUS_ACCESS_DENIED; + memset(&dh, 0, sizeof dh); if (0 == filedesc->DirBuffer) @@ -2029,6 +2057,8 @@ static NTSTATUS fsp_fuse_intf_SetReparsePoint(FSP_FILE_SYSTEM *FileSystem, goto exit; } + filedesc->IsReparsePoint = TRUE; + Result = STATUS_SUCCESS; exit: diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h index b44c6e60..a79fd932 100644 --- a/src/dll/fuse/library.h +++ b/src/dll/fuse/library.h @@ -60,7 +60,7 @@ struct fsp_fuse_context_header struct fsp_fuse_file_desc { char *PosixPath; - BOOLEAN IsDirectory; + BOOLEAN IsDirectory, IsReparsePoint; int OpenFlags; UINT64 FileHandle; PVOID DirBuffer;