Robert Reif : advapi32: LookupAccountSid buffer size query fixes.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 21 05:58:42 CDT 2006


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

Author: Robert Reif <reif at earthlink.net>
Date:   Sat Aug 19 09:16:05 2006 -0400

advapi32: LookupAccountSid buffer size query fixes.

---

 dlls/advapi32/security.c |   58 +++++++++++++++++++++++++++++-----------------
 1 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index 4c55f56..2ac1758 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -1827,8 +1827,8 @@ LookupAccountSidA(
     LPWSTR systemW = NULL;
     LPWSTR accountW = NULL;
     LPWSTR domainW = NULL;
-    DWORD accountSizeW = *accountSize * sizeof(WCHAR);
-    DWORD domainSizeW = *domainSize * sizeof(WCHAR);
+    DWORD accountSizeW = *accountSize;
+    DWORD domainSizeW = *domainSize;
 
     TRACE("(%s,sid=%s,%p,%p(%lu),%p,%p(%lu),%p)\n",
           debugstr_a(system),debugstr_sid(sid),
@@ -1838,22 +1838,30 @@ LookupAccountSidA(
 
     if (system) {
         len = MultiByteToWideChar( CP_ACP, 0, system, -1, NULL, 0 );
-        systemW = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof(WCHAR) );
+        systemW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
         MultiByteToWideChar( CP_ACP, 0, system, -1, systemW, len );
     }
-    accountW = HeapAlloc( GetProcessHeap(), 0, accountSizeW );
-    domainW = HeapAlloc( GetProcessHeap(), 0, domainSizeW );
+    if (account)
+        accountW = HeapAlloc( GetProcessHeap(), 0, accountSizeW * sizeof(WCHAR) );
+    if (domain)
+        domainW = HeapAlloc( GetProcessHeap(), 0, domainSizeW * sizeof(WCHAR) );
 
-    r = LookupAccountSidW(systemW, sid, accountW, &accountSizeW, domainW, &domainSizeW, name_use );
+    r = LookupAccountSidW( systemW, sid, accountW, &accountSizeW, domainW, &domainSizeW, name_use );
 
     if (r) {
-        len = WideCharToMultiByte( CP_ACP, 0, accountW, -1, NULL, 0, NULL, NULL );
-        WideCharToMultiByte( CP_ACP, 0, accountW, -1, account, len, NULL, NULL );
-        *accountSize = len;
+        if (accountW && *accountSize) {
+            len = WideCharToMultiByte( CP_ACP, 0, accountW, -1, NULL, 0, NULL, NULL );
+            WideCharToMultiByte( CP_ACP, 0, accountW, -1, account, len, NULL, NULL );
+            *accountSize = len;
+        } else
+            *accountSize = accountSizeW;
 
-        len = WideCharToMultiByte( CP_ACP, 0, domainW, -1, NULL, 0, NULL, NULL );
-        WideCharToMultiByte( CP_ACP, 0, domainW, -1, domain, len, NULL, NULL );
-        *domainSize = len;
+        if (domainW && *domainSize) {
+            len = WideCharToMultiByte( CP_ACP, 0, domainW, -1, NULL, 0, NULL, NULL );
+            WideCharToMultiByte( CP_ACP, 0, domainW, -1, domain, len, NULL, NULL );
+            *domainSize = len;
+        } else
+            *domainSize = domainSizeW;
     }
 
     HeapFree( GetProcessHeap(), 0, systemW );
@@ -1988,17 +1996,25 @@ LookupAccountSidW(
     }
 
     if (dm) {
-        *accountSize = strlenW(ac)+1;
-        if (account && (*accountSize > strlenW(ac)))
-            strcpyW(account, ac);
-
-        *domainSize = strlenW(dm)+1;
-        if (domain && (*domainSize > strlenW(dm)))
-            strcpyW(domain,dm);
-
+        BOOL status = TRUE;
+        if (*accountSize > lstrlenW(ac)) {
+            if (account)
+                lstrcpyW(account, ac);
+        }
+        if (*domainSize > lstrlenW(dm)) {
+            if (domain)
+                lstrcpyW(domain, dm);
+        }
+        if (((*accountSize != 0) && (*accountSize < strlenW(ac))) ||
+            ((*domainSize != 0) && (*domainSize < strlenW(dm)))) {
+            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+            status = FALSE;
+        }
+        *domainSize = strlenW(dm) + 1;
+        *accountSize = strlenW(ac) + 1;
         *name_use = use;
         HeapFree(GetProcessHeap(), 0, computer_name);
-        return TRUE;
+        return status;
     }
 
     HeapFree(GetProcessHeap(), 0, computer_name);




More information about the wine-cvs mailing list