Hans Leidekker : advapi32: Fix handling of zero account and domain size parameters in LookupAccountSid .

Alexandre Julliard julliard at winehq.org
Tue Sep 21 13:59:28 CDT 2010


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue Sep 21 12:54:50 2010 +0200

advapi32: Fix handling of zero account and domain size parameters in LookupAccountSid.

---

 dlls/advapi32/security.c       |   15 ++++++++++++---
 dlls/advapi32/tests/security.c |   12 +++++++++++-
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index 3e7699a..0458033 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -2069,6 +2069,11 @@ LookupAccountSidA(
         } else
             *domainSize = domainSizeW + 1;
     }
+    else
+    {
+        *accountSize = accountSizeW + 1;
+        *domainSize = domainSizeW + 1;
+    }
 
     HeapFree( GetProcessHeap(), 0, systemW );
     HeapFree( GetProcessHeap(), 0, accountW );
@@ -2225,8 +2230,11 @@ LookupAccountSidW(
             if (domain)
                 lstrcpyW(domain, dm);
         }
-        if (((*accountSize != 0) && (*accountSize < ac_len)) ||
-            ((*domainSize != 0) && (*domainSize < dm_len))) {
+        if ((*accountSize && *accountSize < ac_len) ||
+            (!account && !*accountSize && ac_len)   ||
+            (*domainSize && *domainSize < dm_len)   ||
+            (!domain && !*domainSize && dm_len))
+        {
             SetLastError(ERROR_INSUFFICIENT_BUFFER);
             status = FALSE;
         }
@@ -2238,9 +2246,10 @@ LookupAccountSidW(
             *accountSize = ac_len;
         else
             *accountSize = ac_len + 1;
-        *name_use = use;
+
         HeapFree(GetProcessHeap(), 0, account_name);
         HeapFree(GetProcessHeap(), 0, computer_name);
+        if (status) *name_use = use;
         return status;
     }
 
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index 424403b..f599bb1 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -1505,7 +1505,7 @@ static void test_LookupAccountSid(void)
     PSID pUsersSid = NULL;
     SID_NAME_USE use;
     BOOL ret;
-    DWORD size,cbti = 0;
+    DWORD error, size, cbti = 0;
     MAX_SID  max_sid;
     CHAR *str_sidA;
     int i;
@@ -1667,6 +1667,16 @@ static void test_LookupAccountSid(void)
        "LookupAccountSidW() Expected dom_size = %u, got %u\n",
        real_dom_sizeW + 1, dom_sizeW);
 
+    acc_sizeW = dom_sizeW = use = 0;
+    SetLastError(0xdeadbeef);
+    ret = LookupAccountSidW(NULL, pUsersSid, NULL, &acc_sizeW, NULL, &dom_sizeW, &use);
+    error = GetLastError();
+    ok(!ret, "LookupAccountSidW failed %u\n", GetLastError());
+    ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error);
+    ok(acc_sizeW, "expected non-zero account size\n");
+    ok(dom_sizeW, "expected non-zero domain size\n");
+    ok(!use, "expected zero use %u\n", use);
+
     FreeSid(pUsersSid);
 
     /* Test LookupAccountSid with Sid retrieved from token information.




More information about the wine-cvs mailing list