From a292cd4d73da31f8446aeecbaf99139019247fce Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 19 Oct 2018 21:41:52 -0700 Subject: [PATCH 1/6] dll: FspAccessCheckEx: fix #190 --- src/dll/security.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/dll/security.c b/src/dll/security.c index f226c738..16cc54f8 100644 --- a/src/dll/security.c +++ b/src/dll/security.c @@ -341,26 +341,25 @@ FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, if (Request->Req.Create.UserMode) { - if (0 != (FileAttributes & FILE_ATTRIBUTE_READONLY)) + if (FILE_ATTRIBUTE_READONLY == (FileAttributes & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY)) && + (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_ADD_SUBDIRECTORY | FILE_DELETE_CHILD))) { - if (DesiredAccess & - (FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_ADD_SUBDIRECTORY | FILE_DELETE_CHILD)) - { - Result = STATUS_ACCESS_DENIED; - goto exit; - } - if (Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE) - { - Result = STATUS_CANNOT_DELETE; - goto exit; - } + Result = STATUS_ACCESS_DENIED; + goto exit; + } + + if (FILE_ATTRIBUTE_READONLY == (FileAttributes & FILE_ATTRIBUTE_READONLY) && + Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE) + { + Result = STATUS_CANNOT_DELETE; + goto exit; } if (0 == SecurityDescriptorSize) *PGrantedAccess = (MAXIMUM_ALLOWED & DesiredAccess) ? FspFileGenericMapping.GenericAll : DesiredAccess; - if (0 != (FileAttributes & FILE_ATTRIBUTE_READONLY) && + if (FILE_ATTRIBUTE_READONLY == (FileAttributes & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY)) && 0 != (MAXIMUM_ALLOWED & DesiredAccess)) *PGrantedAccess &= ~(FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_ADD_SUBDIRECTORY | FILE_DELETE_CHILD); From 1bebbcf6344f2adc4787ba674c768f26f63758c5 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 19 Oct 2018 21:53:44 -0700 Subject: [PATCH 2/6] dll: FspAccessCheckEx: fix #190 --- src/dll/security.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dll/security.c b/src/dll/security.c index 16cc54f8..8be35119 100644 --- a/src/dll/security.c +++ b/src/dll/security.c @@ -349,7 +349,7 @@ FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, } if (FILE_ATTRIBUTE_READONLY == (FileAttributes & FILE_ATTRIBUTE_READONLY) && - Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE) + (Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE)) { Result = STATUS_CANNOT_DELETE; goto exit; From 55955b851434d593da6965c1511fb672d0faf53f Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 5 Nov 2018 10:45:11 -0800 Subject: [PATCH 3/6] dll: FspAccessCheckEx: fix #190: add test --- tst/winfsp-tests/create-test.c | 53 ++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tst/winfsp-tests/create-test.c b/tst/winfsp-tests/create-test.c index 5392d176..ef9ea3e4 100644 --- a/tst/winfsp-tests/create-test.c +++ b/tst/winfsp-tests/create-test.c @@ -352,6 +352,58 @@ static void create_fileattr_test(void) create_fileattr_dotest(MemfsNet, L"\\\\memfs\\share"); } +static void create_readonlydir_dotest(ULONG Flags, PWSTR Prefix) +{ + void *memfs = memfs_start(Flags); + + HANDLE Handle; + BOOLEAN Success; + DWORD FileAttributes; + WCHAR DirPath[MAX_PATH], FilePath[MAX_PATH]; + + StringCbPrintfW(DirPath, sizeof DirPath, L"%s%s\\dir0", + Prefix ? L"" : L"\\\\?\\GLOBALROOT", Prefix ? Prefix : memfs_volumename(memfs)); + + StringCbPrintfW(FilePath, sizeof FilePath, L"%s%s\\dir0\\file0", + Prefix ? L"" : L"\\\\?\\GLOBALROOT", Prefix ? Prefix : memfs_volumename(memfs)); + + Success = CreateDirectoryW(DirPath, 0); + ASSERT(Success); + + Success = SetFileAttributesW(DirPath, FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_READONLY); + ASSERT(Success); + + FileAttributes = GetFileAttributesW(DirPath); + ASSERT((FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_READONLY) == FileAttributes); + + Handle = CreateFileW(FilePath, + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); + ASSERT(INVALID_HANDLE_VALUE != Handle); + CloseHandle(Handle); + + Success = DeleteFileW(FilePath); + ASSERT(Success); + + Success = RemoveDirectoryW(DirPath); + TEST(create_fileattr_test); + + memfs_stop(memfs); +} + +static void create_readonlydir_test(void) +{ + if (NtfsTests) + { + WCHAR DirBuf[MAX_PATH]; + GetTestDirectory(DirBuf); + create_readonlydir_dotest(-1, DirBuf); + } + if (WinFspDiskTests) + create_readonlydir_dotest(MemfsDisk, 0); + if (WinFspNetTests) + create_readonlydir_dotest(MemfsNet, L"\\\\memfs\\share"); +} + void create_related_dotest(ULONG Flags, PWSTR Prefix) { void *memfs = memfs_start(Flags); @@ -1265,6 +1317,7 @@ void create_tests(void) { TEST(create_test); TEST(create_fileattr_test); + TEST(create_readonlydir_test); TEST(create_related_test); TEST(create_allocation_test); TEST(create_sd_test); From 36ba4ff4027bcd6d8c31011ec378490d82bb845a Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 5 Nov 2018 11:08:47 -0800 Subject: [PATCH 4/6] dll: FspAccessCheckEx: fix #190: add test --- tst/winfsp-tests/create-test.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tst/winfsp-tests/create-test.c b/tst/winfsp-tests/create-test.c index ef9ea3e4..4c05aa21 100644 --- a/tst/winfsp-tests/create-test.c +++ b/tst/winfsp-tests/create-test.c @@ -385,7 +385,17 @@ static void create_readonlydir_dotest(ULONG Flags, PWSTR Prefix) ASSERT(Success); Success = RemoveDirectoryW(DirPath); - TEST(create_fileattr_test); + ASSERT(!Success); + ASSERT(ERROR_ACCESS_DENIED == GetLastError()); + + Success = SetFileAttributesW(DirPath, FILE_ATTRIBUTE_DIRECTORY); + ASSERT(Success); + + FileAttributes = GetFileAttributesW(DirPath); + ASSERT(FILE_ATTRIBUTE_DIRECTORY == FileAttributes); + + Success = RemoveDirectoryW(DirPath); + ASSERT(Success); memfs_stop(memfs); } From 4deb7b96a9e7a9a6f08b64f3896bec3885ac5f23 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 5 Nov 2018 12:39:55 -0800 Subject: [PATCH 5/6] tools: run-tests: disable create_readonlydir_test on FUSE3 (no FileAttributes) --- tools/run-tests.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/run-tests.bat b/tools/run-tests.bat index 748d314b..34da8280 100755 --- a/tools/run-tests.bat +++ b/tools/run-tests.bat @@ -725,13 +725,13 @@ exit /b 0 :sample-passthrough-fuse3-x64 call :__run_sample_fuse_test passthrough-fuse3 x64 passthrough-fuse3-x64 winfsp-tests-x64 ^ - "-create_fileattr_test -setfileinfo_test" + "-create_fileattr_test -create_readonlydir_test -setfileinfo_test" if !ERRORLEVEL! neq 0 goto fail exit /b 0 :sample-passthrough-fuse3-x86 call :__run_sample_fuse_test passthrough-fuse3 x86 passthrough-fuse3-x86 winfsp-tests-x86 ^ - "-create_fileattr_test -setfileinfo_test" + "-create_fileattr_test -create_readonlydir_test -setfileinfo_test" if !ERRORLEVEL! neq 0 goto fail exit /b 0 From 17d687fe7e4d23f5c2be5e67069fd071c7faf40a Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 5 Nov 2018 14:14:21 -0800 Subject: [PATCH 6/6] tools: run-tests: disable create_readonlydir_test on compat FUSE tests (no FileAttributes) --- tools/run-tests.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run-tests.bat b/tools/run-tests.bat index 34da8280..266b5fb0 100755 --- a/tools/run-tests.bat +++ b/tools/run-tests.bat @@ -923,7 +923,7 @@ cd L: >nul 2>nul || (echo Unable to find drive L: >&2 & goto fail) L: "%ProjRoot%\build\VStudio\build\%Configuration%\%3.exe" ^ --external --resilient --case-insensitive-cmp --share-prefix="\%1\%TMP::=$%\%1\test" ^ - -create_fileattr_test -create_allocation_test -create_notraverse_test -create_backup_test -create_restore_test -create_namelen_test ^ + -create_fileattr_test -create_readonlydir_test -create_allocation_test -create_notraverse_test -create_backup_test -create_restore_test -create_namelen_test ^ -getfileinfo_name_test -setfileinfo_test -delete_access_test -delete_mmap_test -rename_flipflop_test -rename_mmap_test -setsecurity_test -querydir_namelen_test -exec_rename_dir_test ^ -reparse* -stream* if !ERRORLEVEL! neq 0 set RunSampleTestExit=1