From 9fd491fa3dbb7e656862ca39c704b768704b39d0 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 15 Mar 2019 11:21:11 -0700 Subject: [PATCH] sys, dll: ea testing --- src/dll/fsop.c | 2 +- src/sys/create.c | 2 +- tst/winfsp-tests/ea-test.c | 26 +++++++++++++++++++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 41e9d2e3..dd50a308 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -1807,7 +1807,7 @@ FSP_API NTSTATUS FspFileSystemEnumerateEa(FSP_FILE_SYSTEM *FileSystem, { NTSTATUS Result = STATUS_SUCCESS; for (PFILE_FULL_EA_INFORMATION EaEnd = (PVOID)((PUINT8)Ea + EaLength); - EaEnd > Ea; FSP_NEXT_EA(Ea, EaEnd)) + EaEnd > Ea; Ea = FSP_NEXT_EA(Ea, EaEnd)) { Result = EnumerateEa(FileSystem, Context, Ea); if (!NT_SUCCESS(Result)) diff --git a/src/sys/create.c b/src/sys/create.c index d60d2bbb..4f8c53d2 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -306,7 +306,7 @@ static NTSTATUS FspFsvolCreateNoLock( if (0 != EaBuffer) { /* does the file system support EA? */ - if (FsvolDeviceExtension->VolumeParams.ExtendedAttributes) + if (!FsvolDeviceExtension->VolumeParams.ExtendedAttributes) return STATUS_EAS_NOT_SUPPORTED; /* do we need EA knowledge? */ diff --git a/tst/winfsp-tests/ea-test.c b/tst/winfsp-tests/ea-test.c index 6966b2fe..df0ce7f4 100644 --- a/tst/winfsp-tests/ea-test.c +++ b/tst/winfsp-tests/ea-test.c @@ -70,6 +70,7 @@ static void ea_create_dotest(ULONG Flags, PWSTR Prefix) FspFileSystemAddEa(&SingleEa.V, &Ea.V, sizeof Ea, &EaLength); memset(&SingleEa, 0, sizeof SingleEa); + SingleEa.V.Flags = FILE_NEED_EA; SingleEa.V.EaNameLength = (UCHAR)strlen("nameTwo"); SingleEa.V.EaValueLength = (USHORT)strlen("second"); lstrcpyA(SingleEa.V.EaName, "nameTwo"); @@ -89,11 +90,34 @@ static void ea_create_dotest(ULONG Flags, PWSTR Prefix) UnicodePath.MaximumLength = sizeof UnicodePathBuf; UnicodePath.Buffer = UnicodePathBuf; InitializeObjectAttributes(&Obja, &UnicodePath, 0, DirHandle, 0); + Result = NtCreateFile(&FileHandle, FILE_GENERIC_READ | FILE_GENERIC_WRITE | DELETE, &Obja, &Iosb, &LargeZero, FILE_ATTRIBUTE_NORMAL, 0, - FILE_CREATE, FILE_DELETE_ON_CLOSE, + FILE_CREATE, FILE_NO_EA_KNOWLEDGE, &Ea, EaLength); + ASSERT(STATUS_ACCESS_DENIED == Result); + + Result = NtCreateFile(&FileHandle, + FILE_GENERIC_READ | FILE_GENERIC_WRITE | DELETE, &Obja, &Iosb, + &LargeZero, FILE_ATTRIBUTE_NORMAL, 0, + FILE_CREATE, 0, + &Ea, EaLength); + ASSERT(STATUS_SUCCESS == Result); + CloseHandle(FileHandle); + + Result = NtCreateFile(&FileHandle, + FILE_GENERIC_READ | FILE_GENERIC_WRITE | DELETE, &Obja, &Iosb, + &LargeZero, FILE_ATTRIBUTE_NORMAL, 0, + FILE_OPEN, FILE_NO_EA_KNOWLEDGE, + 0, 0); + ASSERT(STATUS_ACCESS_DENIED == Result); + + Result = NtCreateFile(&FileHandle, + FILE_GENERIC_READ | FILE_GENERIC_WRITE | DELETE, &Obja, &Iosb, + &LargeZero, FILE_ATTRIBUTE_NORMAL, 0, + FILE_OPEN, FILE_DELETE_ON_CLOSE, + 0, 0); ASSERT(STATUS_SUCCESS == Result); CloseHandle(FileHandle);