[PATCH 03/12] LookupAccountNameW() - returns correct domain name length for not-so-well-known SIDs

Paul Bryan Roberts pbronline-wine at yahoo.co.uk
Sat Oct 18 14:46:35 CDT 2008


---
 dlls/advapi32/security.c       |   25 ++++++++++++++++---------
 dlls/advapi32/tests/security.c |    6 ++----
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index cd7127d..965bab1 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -2498,8 +2498,8 @@ LookupAccountNameA(
 
     if (ret && lpReferencedDomainNameW)
     {
-        WideCharToMultiByte(CP_ACP, 0, lpReferencedDomainNameW, *cbReferencedDomainName,
-            ReferencedDomainName, *cbReferencedDomainName, NULL, NULL);
+        WideCharToMultiByte(CP_ACP, 0, lpReferencedDomainNameW, -1,
+            ReferencedDomainName, *cbReferencedDomainName+1, NULL, NULL);
     }
 
     RtlFreeUnicodeString(&lpSystemW);
@@ -2522,6 +2522,8 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
     PSID pSid;
     static const WCHAR dm[] = {'D','O','M','A','I','N',0};
     unsigned int i;
+    DWORD nameLen;
+    LPCWSTR domainName;
 
     FIXME("%s %s %p %p %p %p %p - stub\n", debugstr_w(lpSystemName), debugstr_w(lpAccountName),
           Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse);
@@ -2562,17 +2564,22 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
        ret = FALSE;
     }
     *cbSid = GetLengthSid(pSid);
-    
-    if (ReferencedDomainName != NULL && (*cchReferencedDomainName > strlenW(dm)))
-      strcpyW(ReferencedDomainName, dm);
 
-    if (*cchReferencedDomainName <= strlenW(dm))
+    domainName = dm;
+    nameLen = strlenW(domainName);
+
+    if (*cchReferencedDomainName <= nameLen || !ret)
     {
-       SetLastError(ERROR_INSUFFICIENT_BUFFER);
-       ret = FALSE;
+        SetLastError(ERROR_INSUFFICIENT_BUFFER);
+        nameLen += 1;
+        ret = FALSE;
+    }
+    else if (ReferencedDomainName && domainName)
+    {
+        strcpyW(ReferencedDomainName, domainName);
     }
 
-    *cchReferencedDomainName = strlenW(dm)+1;
+    *cchReferencedDomainName = nameLen;
 
     if (ret)
     {
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index 829ddd9..7335be3 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -1554,9 +1554,9 @@ static void test_LookupAccountName(void)
     {
         ok(!lstrcmp(account, user_name), "Expected %s, got %s\n", user_name, account);
         ok(!lstrcmp(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain);
-        ok(domain_size == domain_save - 1, "Expected %d, got %d\n", domain_save - 1, domain_size);
-        ok(lstrlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size);
     }
+    ok(domain_size == domain_save - 1, "Expected %d, got %d\n", domain_save - 1, domain_size);
+    ok(lstrlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size);
     ok(sid_use == SidTypeUser, "Expected SidTypeUser, got %d\n", sid_use);
     domain_size = domain_save;
     sid_size = sid_save;
@@ -1572,10 +1572,8 @@ static void test_LookupAccountName(void)
         ok(ret, "Failed to lookup account name\n");
         ok(sid_size != 0, "sid_size was zero\n");
         ok(!lstrcmp(account, "Everyone"), "Expected Everyone, got %s\n", account);
-        todo_wine
         ok(!lstrcmp(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain);
         ok(domain_size == 0, "Expected 0, got %d\n", domain_size);
-        todo_wine
         ok(lstrlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size);
         ok(sid_use == SidTypeWellKnownGroup, "Expected SidTypeUser, got %d\n", sid_use);
         domain_size = domain_save;
-- 
1.5.4.3


--------------020906090405050202070601--



More information about the wine-patches mailing list