[NETAPI32]
authorEric Kohl <eric.kohl@reactos.org>
Sun, 15 Sep 2013 09:11:32 +0000 (09:11 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 15 Sep 2013 09:11:32 +0000 (09:11 +0000)
NetLocalGroupGetMembers:
- Do not try to add the size of a domain name to the return buffer if the domain index is negative.
- Do not try to copy a domain name to the return buffer if the domain index is negative.
- Move the write pointer after writing the domain name.

svn path=/trunk/; revision=60125

reactos/dll/win32/netapi32/local_group.c

index 0385df6..026beb6 100644 (file)
@@ -1528,14 +1528,16 @@ NetLocalGroupGetMembers(
             case 2:
                 Size += sizeof(LOCALGROUP_MEMBERS_INFO_2) +
                         RtlLengthSid(EnumContext->Sids[i]) +
-                        EnumContext->Names[i].Name.Length + sizeof(WCHAR) +
-                        EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
+                        EnumContext->Names[i].Name.Length + sizeof(WCHAR);
+                if (EnumContext->Names[i].DomainIndex >= 0)
+                    Size += EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
                 break;
 
             case 3:
                 Size += sizeof(LOCALGROUP_MEMBERS_INFO_3) +
-                        EnumContext->Names[i].Name.Length + sizeof(WCHAR) +
-                        EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
+                        EnumContext->Names[i].Name.Length + sizeof(WCHAR);
+                if (EnumContext->Names[i].DomainIndex >= 0)
+                    Size += EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
                 break;
 
             default:
@@ -1609,6 +1611,7 @@ NetLocalGroupGetMembers(
                 memcpy(MembersInfo1->lgrmi1_name,
                        EnumContext->Names[i].Name.Buffer,
                        EnumContext->Names[i].Name.Length);
+                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Names[i].Name.Length + sizeof(WCHAR));
                 MembersInfo1++;
                 break;
 
@@ -1625,37 +1628,47 @@ NetLocalGroupGetMembers(
                 MembersInfo2->lgrmi2_sidusage = EnumContext->Names[i].Use;
 
                 MembersInfo2->lgrmi2_domainandname = (LPWSTR)Ptr;
-                memcpy(MembersInfo2->lgrmi2_domainandname,
-                       EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
-                       EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
 
-                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
+                if (EnumContext->Names[i].DomainIndex >= 0)
+                {
+                    memcpy(MembersInfo2->lgrmi2_domainandname,
+                           EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
+                           EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
+
+                    Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
 
-                *((LPWSTR)Ptr) = L'\\';
+                    *((LPWSTR)Ptr) = L'\\';
 
-                Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
+                    Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
+                }
 
                 memcpy(Ptr,
                        EnumContext->Names[i].Name.Buffer,
                        EnumContext->Names[i].Name.Length);
+                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Names[i].Name.Length + sizeof(WCHAR));
                 MembersInfo2++;
                 break;
 
             case 3:
                 MembersInfo3->lgrmi3_domainandname = (PSID)Ptr;
-                memcpy(MembersInfo2->lgrmi2_domainandname,
-                       EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
-                       EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
 
-                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
+                if (EnumContext->Names[i].DomainIndex >= 0)
+                {
+                    memcpy(MembersInfo2->lgrmi2_domainandname,
+                           EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
+                           EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
+
+                    Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
 
-                *((LPWSTR)Ptr) = L'\\';
+                    *((LPWSTR)Ptr) = L'\\';
 
-                Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
+                    Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
+                }
 
                 memcpy(Ptr,
                        EnumContext->Names[i].Name.Buffer,
                        EnumContext->Names[i].Name.Length);
+                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Names[i].Name.Length + sizeof(WCHAR));
                 MembersInfo3++;
                 break;
         }