Nikolay Sivov : advapi32: Fix LsaLookupNames2() regarding referenced domain list allocation.

Alexandre Julliard julliard at winehq.org
Mon Jan 21 13:52:23 CST 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Jan 19 23:39:12 2013 +0400

advapi32: Fix LsaLookupNames2() regarding referenced domain list allocation.

---

 dlls/advapi32/lsa.c |   58 ++++++++++++--------------------------------------
 1 files changed, 14 insertions(+), 44 deletions(-)

diff --git a/dlls/advapi32/lsa.c b/dlls/advapi32/lsa.c
index 45cc48e..5c3ffc4 100644
--- a/dlls/advapi32/lsa.c
+++ b/dlls/advapi32/lsa.c
@@ -311,39 +311,6 @@ static BOOL lookup_name( LSA_UNICODE_STRING *name, SID *sid, DWORD *sid_size, WC
     return ret;
 }
 
-static INT build_domain(PLSA_REFERENCED_DOMAIN_LIST currentList, PLSA_UNICODE_STRING domain)
-{
-    ULONG count;
-    ULONG sid_size = 0,domain_size = 0;
-    BOOL handled = FALSE;
-    SID_NAME_USE use;
-
-    for (count = 0; count < currentList->Entries; count ++)
-    {
-        if ((currentList->Domains[count].Name.Length == domain->Length) &&
-            (strncmpiW(currentList->Domains[count].Name.Buffer,domain->Buffer,(domain->Length / sizeof(WCHAR))) == 0))
-        {
-            HeapFree(GetProcessHeap(),0,domain->Buffer);
-            return count;
-        }
-    }
-
-    if (currentList->Entries > 0)
-        currentList->Domains = HeapReAlloc(GetProcessHeap(),0,currentList->Domains, (currentList->Entries + 1) * sizeof(LSA_TRUST_INFORMATION));
-    else
-        currentList->Domains = HeapAlloc(GetProcessHeap(),0,sizeof(LSA_TRUST_INFORMATION));
-
-    currentList->Domains[currentList->Entries].Name = *domain;
-
-    lookup_name( domain, NULL, &sid_size, NULL, &domain_size, &use, &handled );
-    domain_size = 0;
-    currentList->Domains[currentList->Entries].Sid = HeapAlloc(GetProcessHeap(),0,sid_size);
-    lookup_name( domain, currentList->Domains[currentList->Entries].Sid, &sid_size, NULL, &domain_size, &use, &handled );
-
-    currentList->Entries++;
-    return currentList->Entries-1;
-}
-
 /* Adds domain info to referenced domain list.
    Domain list is stored as plain buffer, layout is:
 
@@ -402,9 +369,10 @@ NTSTATUS WINAPI LsaLookupNames2( LSA_HANDLE policy, ULONG flags, ULONG count,
                                  PLSA_UNICODE_STRING names, PLSA_REFERENCED_DOMAIN_LIST *domains,
                                  PLSA_TRANSLATED_SID2 *sids )
 {
-    ULONG i, sid_size_total = 0, domain_size_max = 0, size;
+    ULONG i, sid_size_total = 0, domain_size_max = 0, size, domainname_size_total = 0;
     ULONG sid_size, domain_size, mapped;
     BOOL handled = FALSE;
+    char *domain_data;
     SID_NAME_USE use;
     SID *sid;
 
@@ -419,6 +387,7 @@ NTSTATUS WINAPI LsaLookupNames2( LSA_HANDLE policy, ULONG flags, ULONG count,
         if (handled)
         {
             sid_size_total += sid_size;
+            domainname_size_total += domain_size;
             if (domain_size)
             {
                 if (domain_size > domain_size_max)
@@ -430,17 +399,20 @@ NTSTATUS WINAPI LsaLookupNames2( LSA_HANDLE policy, ULONG flags, ULONG count,
     TRACE("mapped %u out of %u\n", mapped, count);
 
     size = sizeof(LSA_TRANSLATED_SID2) * count + sid_size_total;
-    if (!(*sids = HeapAlloc( GetProcessHeap(), 0, size) )) return STATUS_NO_MEMORY;
+    if (!(*sids = heap_alloc(size))) return STATUS_NO_MEMORY;
 
     sid = (SID *)(*sids + count);
 
-    if (!(*domains = HeapAlloc( GetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST) )))
+    /* use maximum domain count */
+    if (!(*domains = heap_alloc(sizeof(LSA_REFERENCED_DOMAIN_LIST) + sizeof(LSA_TRUST_INFORMATION)*count +
+                                sid_size_total + domainname_size_total)))
     {
-        HeapFree( GetProcessHeap(), 0, *sids );
+        heap_free(*sids);
         return STATUS_NO_MEMORY;
     }
     (*domains)->Entries = 0;
-    (*domains)->Domains = NULL;
+    (*domains)->Domains = (LSA_TRUST_INFORMATION*)((char*)*domains + sizeof(LSA_REFERENCED_DOMAIN_LIST));
+    domain_data = (char*)(*domains)->Domains + sizeof(LSA_TRUST_INFORMATION)*count;
 
     for (i = 0; i < count; i++)
     {
@@ -448,7 +420,7 @@ NTSTATUS WINAPI LsaLookupNames2( LSA_HANDLE policy, ULONG flags, ULONG count,
 
         domain.Length = domain_size_max*sizeof(WCHAR);
         domain.MaximumLength = domain_size_max*sizeof(WCHAR);
-        domain.Buffer = HeapAlloc(GetProcessHeap(),0,domain.Length);
+        domain.Buffer = heap_alloc(domain.Length);
 
         (*sids)[i].Use = SidTypeUnknown;
         (*sids)[i].DomainIndex = -1;
@@ -468,13 +440,11 @@ NTSTATUS WINAPI LsaLookupNames2( LSA_HANDLE policy, ULONG flags, ULONG count,
             if (domain_size)
             {
                 domain.Length = domain_size * sizeof(WCHAR);
-                (*sids)[i].DomainIndex = build_domain(*domains, &domain);
+                (*sids)[i].DomainIndex = lsa_reflist_add_domain(*domains, &domain, &domain_data);
             }
-            else
-                HeapFree(GetProcessHeap(),0,domain.Buffer);
         }
-        else
-            HeapFree(GetProcessHeap(),0,domain.Buffer);
+
+        heap_free(domain.Buffer);
     }
 
     if (mapped == count) return STATUS_SUCCESS;




More information about the wine-cvs mailing list