[PATCH 1/6] advapi32: GetFileSecurity() a couple of simple tests and a fix

Paul Bryan Roberts pbronline-wine at yahoo.co.uk
Mon Nov 3 14:42:45 CST 2008


---
 dlls/advapi32/security.c       |   10 ++++
 dlls/advapi32/tests/security.c |   92 ++++++++++++++++++++++++++++++++-------
 2 files changed, 85 insertions(+), 17 deletions(-)

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index 2093f7e..3fadf2e 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -1915,6 +1915,16 @@ GetFileSecurityW( LPCWSTR lpFileName,
     NTSTATUS status;
     DWORD access = 0;
 
+    TRACE("(%s,%d,%p,%d,%p)\n", debugstr_w(lpFileName),
+          RequestedInformation, pSecurityDescriptor,
+          nLength, lpnLengthNeeded);
+
+    if (pSecurityDescriptor == NULL && nLength != 0)
+    {
+        SetLastError( ERROR_NOACCESS );
+        return FALSE;
+    }
+
     if (RequestedInformation & (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|
                                 DACL_SECURITY_INFORMATION))
         access |= READ_CONTROL;
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index d4f532d..6d7825e 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -87,6 +87,8 @@ static BOOL (WINAPI *pConvertSecurityDescriptorToStringSecurityDescriptorA)(PSEC
                                                                             SECURITY_INFORMATION, LPSTR *, PULONG );
 typedef BOOL (WINAPI *fnGetFileSecurityA)(LPCSTR, SECURITY_INFORMATION,
                                           PSECURITY_DESCRIPTOR, DWORD, LPDWORD);
+typedef BOOL (WINAPI *fnSetFileSecurityA)(LPCSTR, SECURITY_INFORMATION,
+                                          PSECURITY_DESCRIPTOR);
 static DWORD (WINAPI *pGetNamedSecurityInfoA)(LPSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION,
                                               PSID*, PSID*, PACL*, PACL*,
                                               PSECURITY_DESCRIPTOR*);
@@ -119,6 +121,7 @@ fnMakeSelfRelativeSD pMakeSelfRelativeSD;
 fnConvertSidToStringSidA pConvertSidToStringSidA;
 fnConvertStringSidToSidA pConvertStringSidToSidA;
 fnGetFileSecurityA pGetFileSecurityA;
+fnSetFileSecurityA pSetFileSecurityA;
 fnRtlAdjustPrivilege pRtlAdjustPrivilege;
 fnCreateWellKnownSid pCreateWellKnownSid;
 fnDuplicateTokenEx pDuplicateTokenEx;
@@ -150,6 +153,8 @@ static void init(void)
         (void *)GetProcAddress(hmod, "ConvertStringSecurityDescriptorToSecurityDescriptorW" );
     pConvertSecurityDescriptorToStringSecurityDescriptorA =
         (void *)GetProcAddress(hmod, "ConvertSecurityDescriptorToStringSecurityDescriptorA" );
+    pGetFileSecurityA = (fnGetFileSecurityA)GetProcAddress(hmod, "GetFileSecurityA" );
+    pSetFileSecurityA = (fnSetFileSecurityA)GetProcAddress(hmod, "SetFileSecurityA" );
     pCreateWellKnownSid = (fnCreateWellKnownSid)GetProcAddress( hmod, "CreateWellKnownSid" );
     pGetNamedSecurityInfoA = (void *)GetProcAddress(hmod, "GetNamedSecurityInfoA");
     pMakeSelfRelativeSD = (void *)GetProcAddress(hmod, "MakeSelfRelativeSD");
@@ -694,29 +699,82 @@ static void test_luid(void)
 
 static void test_FileSecurity(void)
 {
-    char directory[MAX_PATH];
-    DWORD retval, outSize;
-    BOOL result;
-    BYTE buffer[0x40];
-
-    pGetFileSecurityA = (fnGetFileSecurityA)
-                    GetProcAddress( hmod, "GetFileSecurityA" );
-    if( !pGetFileSecurityA )
+    char wintmpdir [MAX_PATH];
+    char path [MAX_PATH];
+    char file [MAX_PATH];
+    BOOL rc;
+    HANDLE fh;
+    SECURITY_DESCRIPTOR toosmall;
+    DWORD sdSize;
+    SECURITY_INFORMATION const request = OWNER_SECURITY_INFORMATION
+                                       | GROUP_SECURITY_INFORMATION 
+                                       | DACL_SECURITY_INFORMATION;
+
+    if (!pGetFileSecurityA) {
+        win_skip ("GetFileSecurity is not available\n");
         return;
+    }
 
-    retval = GetTempPathA(sizeof(directory), directory);
-    if (!retval) {
-        trace("GetTempPathA failed\n");
+    if (!pSetFileSecurityA) {
+        win_skip ("SetFileSecurity is not available\n");
         return;
     }
 
-    strcpy(directory, "\\Should not exist");
+    if (!GetTempPathA (sizeof (wintmpdir), wintmpdir)) {
+        win_skip ("GetTempPathA failed\n");
+        return;
+    }
 
-    SetLastError(NO_ERROR);
-    result = pGetFileSecurityA( directory,OWNER_SECURITY_INFORMATION,buffer,0x40,&outSize);
-    ok(!result, "GetFileSecurityA should fail for not existing directories/files\n"); 
-    ok( (GetLastError() == ERROR_FILE_NOT_FOUND ) ||
-        (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) , 
+    DeleteFileA (file);
+    RemoveDirectoryA (path);
+
+    /* Create a temporary directory and in it a temporary file */
+    strcat (strcpy (path, wintmpdir), "rary");
+    SetLastError (NO_ERROR);
+    rc = CreateDirectoryA (path, NULL);
+    ok (rc || GetLastError() == ERROR_ALREADY_EXISTS, "CreateDirectoryA "
+        "failed for '%s' with %d\n", path, GetLastError());
+
+    strcat (strcpy (file, path), "\\ess");
+    SetLastError (NO_ERROR);
+    fh = CreateFileA (file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
+    ok (fh != INVALID_HANDLE_VALUE, "CreateFileA "
+        "failed for '%s' with %d\n", file, GetLastError());
+    CloseHandle (fh);
+
+    /* Get file's security descriptor - fail, but not the way one might expect */
+    sdSize = 0;
+    SetLastError (NO_ERROR);
+    rc = pGetFileSecurityA (file, request, NULL, sizeof (toosmall), &sdSize);
+    ok (!rc, "GetFileSecurityA "
+        "was expected to fail for file '%s'\n", file);
+    ok (GetLastError() == ERROR_NOACCESS, "GetFileSecurityA "
+        "returned %d; expected ERROR_NOACCESS\n", GetLastError());
+    ok (sdSize == 0, "GetFileSecurityA "
+        "returned size %d; expected == %d\n", sdSize, 0);
+
+    /* Get file's security descriptor - fail the way one might expect */
+    sdSize = 0;
+    SetLastError (NO_ERROR);
+    rc = pGetFileSecurityA (file, request, &toosmall, sizeof (toosmall), &sdSize);
+    ok (!rc, "GetFileSecurityA "
+        "was expected to fail for file '%s'\n", file);
+    ok (GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetFileSecurityA "
+        "returned %d; expected ERROR_NOACCESS\n", GetLastError());
+    ok (sdSize > sizeof (SECURITY_DESCRIPTOR), "GetFileSecurityA "
+        "returned size %d; expected > %d\n", sdSize, sizeof (SECURITY_DESCRIPTOR));
+
+    /* Remove temporary file and directory */
+    DeleteFileA (file);
+    RemoveDirectoryA (path);
+
+    /* Old test */
+    strcpy (wintmpdir, "\\Should not exist");
+    SetLastError (NO_ERROR);
+    rc = pGetFileSecurityA (wintmpdir, OWNER_SECURITY_INFORMATION, NULL, 0, &sdSize);
+    ok (!rc, "GetFileSecurityA should fail for not existing directories/files\n");
+    ok ((GetLastError() == ERROR_FILE_NOT_FOUND ) ||
+        (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED),
         "last error ERROR_FILE_NOT_FOUND / ERROR_CALL_NOT_IMPLEMENTED (98) "
         "expected, got %d\n", GetLastError());
 }
-- 
1.5.4.3


--------------090609010700010409020009--



More information about the wine-patches mailing list