From 92dfb0be961411e6a5e00b878d53e0dcc06b37c3 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 17 Mar 2019 12:39:00 -0700 Subject: [PATCH] tst: winfsp-tests: ea --- tst/winfsp-tests/ea-test.c | 68 ++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/tst/winfsp-tests/ea-test.c b/tst/winfsp-tests/ea-test.c index 6d1050e1..cbbab08c 100644 --- a/tst/winfsp-tests/ea-test.c +++ b/tst/winfsp-tests/ea-test.c @@ -83,6 +83,40 @@ static void ea_init_ea( FspFileSystemAddEa(0, Ea, EaLength, PBytesTransferred); } +static void ea_init_bad_ea( + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, PULONG PBytesTransferred) +{ + union + { + FILE_FULL_EA_INFORMATION V; + UINT8 B[128]; + } SingleEa; + + memset(&SingleEa, 0, sizeof SingleEa); + SingleEa.V.EaNameLength = (UCHAR)strlen("Aname1"); + SingleEa.V.EaValueLength = (USHORT)strlen("first"); + lstrcpyA(SingleEa.V.EaName, "Aname1"); + memcpy(SingleEa.V.EaName + SingleEa.V.EaNameLength + 1, "first", SingleEa.V.EaValueLength); + FspFileSystemAddEa(&SingleEa.V, Ea, EaLength, PBytesTransferred); + + memset(&SingleEa, 0, sizeof SingleEa); + SingleEa.V.Flags = FILE_NEED_EA; + SingleEa.V.EaNameLength = (UCHAR)strlen("bnameTwo*"); + SingleEa.V.EaValueLength = (USHORT)strlen("second"); + lstrcpyA(SingleEa.V.EaName, "bnameTwo*"); + memcpy(SingleEa.V.EaName + SingleEa.V.EaNameLength + 1, "second", SingleEa.V.EaValueLength); + FspFileSystemAddEa(&SingleEa.V, Ea, EaLength, PBytesTransferred); + + memset(&SingleEa, 0, sizeof SingleEa); + SingleEa.V.EaNameLength = (UCHAR)strlen("Cn3"); + SingleEa.V.EaValueLength = (USHORT)strlen("third"); + lstrcpyA(SingleEa.V.EaName, "Cn3"); + memcpy(SingleEa.V.EaName + SingleEa.V.EaNameLength + 1, "third", SingleEa.V.EaValueLength); + FspFileSystemAddEa(&SingleEa.V, Ea, EaLength, PBytesTransferred); + + FspFileSystemAddEa(0, Ea, EaLength, PBytesTransferred); +} + struct ea_check_ea_context { ULONG Count; @@ -402,7 +436,7 @@ static void ea_create_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout) FILE_FULL_EA_INFORMATION V; UINT8 B[512]; } Ea; - ULONG EaLength = 0; + ULONG EaLength; StringCbPrintfW(FilePath, sizeof FilePath, L"%s%s\\dir1", Prefix ? L"" : L"\\\\?\\GLOBALROOT", Prefix ? Prefix : memfs_volumename(memfs)); @@ -415,13 +449,23 @@ static void ea_create_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout) FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_DELETE_ON_CLOSE, 0); ASSERT(INVALID_HANDLE_VALUE != DirHandle); - ea_init_ea(&Ea.V, sizeof Ea, &EaLength); - UnicodePath.Length = (USHORT)wcslen(UnicodePathBuf) * sizeof(WCHAR); UnicodePath.MaximumLength = sizeof UnicodePathBuf; UnicodePath.Buffer = UnicodePathBuf; InitializeObjectAttributes(&Obja, &UnicodePath, 0, DirHandle, 0); + EaLength = 0; + ea_init_bad_ea(&Ea.V, sizeof Ea, &EaLength); + Result = NtCreateFile(&FileHandle, + FILE_GENERIC_READ | FILE_GENERIC_WRITE | DELETE, &Obja, &Iosb, + &LargeZero, FILE_ATTRIBUTE_NORMAL, 0, + FILE_CREATE, 0, + &Ea, EaLength); + ASSERT(STATUS_INVALID_EA_NAME == Result); + + EaLength = 0; + ea_init_ea(&Ea.V, sizeof Ea, &EaLength); + Result = NtCreateFile(&FileHandle, FILE_GENERIC_READ | FILE_GENERIC_WRITE | DELETE, &Obja, &Iosb, &LargeZero, FILE_ATTRIBUTE_NORMAL, 0, @@ -498,9 +542,7 @@ static void ea_getset_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout) FILE_FULL_EA_INFORMATION V; UINT8 B[512]; } Ea; - ULONG EaLength = 0; - - ea_init_ea(&Ea.V, sizeof Ea, &EaLength); + ULONG EaLength; StringCbPrintfW(FilePath, sizeof FilePath, L"%s%s\\dir1", Prefix ? L"" : L"\\\\?\\GLOBALROOT", Prefix ? Prefix : memfs_volumename(memfs)); @@ -513,6 +555,13 @@ static void ea_getset_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout) FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_DELETE_ON_CLOSE, 0); ASSERT(INVALID_HANDLE_VALUE != DirHandle); + EaLength = 0; + ea_init_bad_ea(&Ea.V, sizeof Ea, &EaLength); + Result = NtSetEaFile(DirHandle, &Iosb, &Ea, EaLength); + ASSERT(STATUS_INVALID_EA_NAME == Result); + + EaLength = 0; + ea_init_ea(&Ea.V, sizeof Ea, &EaLength); Result = NtSetEaFile(DirHandle, &Iosb, &Ea, EaLength); ASSERT(STATUS_SUCCESS == Result); ASSERT(0 == Iosb.Information); @@ -534,6 +583,13 @@ static void ea_getset_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout) FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, 0); ASSERT(INVALID_HANDLE_VALUE != FileHandle); + EaLength = 0; + ea_init_bad_ea(&Ea.V, sizeof Ea, &EaLength); + Result = NtSetEaFile(FileHandle, &Iosb, &Ea, EaLength); + ASSERT(STATUS_INVALID_EA_NAME == Result); + + EaLength = 0; + ea_init_ea(&Ea.V, sizeof Ea, &EaLength); Result = NtSetEaFile(FileHandle, &Iosb, &Ea, EaLength); ASSERT(STATUS_SUCCESS == Result); ASSERT(0 == Iosb.Information);