Aric Stewart : advapi32: Handle fully qualified account names for well known sids in LookupAccountName .

Alexandre Julliard julliard at winehq.org
Wed Apr 1 10:11:27 CDT 2009


Module: wine
Branch: master
Commit: 9d9a684ef6cb9bf70235594e81de1e3b0387beeb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9d9a684ef6cb9bf70235594e81de1e3b0387beeb

Author: Aric Stewart <aric at codeweavers.com>
Date:   Tue Mar 31 09:00:11 2009 -0500

advapi32: Handle fully qualified account names for well known sids in LookupAccountName.

---

 dlls/advapi32/security.c       |   17 +++++++++++++++--
 dlls/advapi32/tests/security.c |    7 +++++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index a26e81a..f8715e0 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -2651,6 +2651,8 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
     DWORD nameLen;
     LPWSTR userName = NULL;
     LPCWSTR domainName;
+    LPCWSTR lpAccountNamePtr;
+    LPCWSTR lpDomainNamePtr = NULL;
 
     FIXME("%s %s %p %p %p %p %p - stub\n", debugstr_w(lpSystemName), debugstr_w(lpAccountName),
           Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse);
@@ -2667,11 +2669,22 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
     }
 
     /* Check well known SIDs first */
+    if ((lpAccountNamePtr = strrchrW(lpAccountName,'\\')))
+    {
+        lpAccountNamePtr++;
+        lpDomainNamePtr = lpAccountName;
+    }
+    else
+        lpAccountNamePtr = lpAccountName;
 
     for (i = 0; i < (sizeof(ACCOUNT_SIDS) / sizeof(ACCOUNT_SIDS[0])); i++)
     {
-        if (!strcmpiW(lpAccountName, ACCOUNT_SIDS[i].account) ||
-            (ACCOUNT_SIDS[i].alias && !strcmpiW(lpAccountName, ACCOUNT_SIDS[i].alias)))
+        /* check domain first */
+        if (lpDomainNamePtr && (strncmpiW(lpDomainNamePtr, ACCOUNT_SIDS[i].domain, strlenW(ACCOUNT_SIDS[i].domain)) || lpDomainNamePtr[strlenW(ACCOUNT_SIDS[i].domain)]!='\\'))
+            continue;
+
+        if (!strcmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].account) ||
+            (ACCOUNT_SIDS[i].alias && !strcmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].alias)))
         {
             DWORD sidLen = SECURITY_MAX_SID_SIZE;
 
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index e557c1f..f264fd8 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -1982,6 +1982,13 @@ static void test_LookupAccountName(void)
 
     /* case insensitivity */
     check_wellknown_name("lOCAlServICE", WinLocalServiceSid);
+
+    /* fully qualified account names */
+    check_wellknown_name("NT AUTHORITY\\LocalService", WinLocalServiceSid);
+    check_wellknown_name("nt authority\\Network Service", WinNetworkServiceSid);
+    check_wellknown_name("nt authority test\\Network Service", 0);
+    check_wellknown_name("Dummy\\Network Service", 0);
+    check_wellknown_name("ntauthority\\Network Service", 0);
 }
 
 static void test_security_descriptor(void)




More information about the wine-cvs mailing list