Fixes several bugs in the current implementation of LsapSplitNames and LsapLookupNames. This fixes the crashing lsa advapi32 wintest. LsapLookupNames is still WIP.

svn path=/trunk/; revision=57464
This commit is contained in:
Eric Kohl 2012-10-03 13:05:06 +00:00
parent 48028ca4f0
commit e0103d4c59

View file

@ -676,8 +676,7 @@ TRACE("i: %lu\n", i);
PWELL_KNOWN_SID PWELL_KNOWN_SID
LsapLookupWellKnownName(LPWSTR Domain, LsapLookupWellKnownName(PUNICODE_STRING Name)
LPWSTR Account)
{ {
PLIST_ENTRY ListEntry; PLIST_ENTRY ListEntry;
PWELL_KNOWN_SID Ptr; PWELL_KNOWN_SID Ptr;
@ -688,7 +687,7 @@ LsapLookupWellKnownName(LPWSTR Domain,
Ptr = CONTAINING_RECORD(ListEntry, Ptr = CONTAINING_RECORD(ListEntry,
WELL_KNOWN_SID, WELL_KNOWN_SID,
ListEntry); ListEntry);
if (_wcsicmp(Account, Ptr->Name.Buffer) == 0) if (RtlEqualUnicodeString(Name, &Ptr->Name, TRUE))
return Ptr; return Ptr;
ListEntry = ListEntry->Flink; ListEntry = ListEntry->Flink;
@ -708,6 +707,7 @@ LsapSplitNames(DWORD Count,
PRPC_UNICODE_STRING DomainsBuffer = NULL; PRPC_UNICODE_STRING DomainsBuffer = NULL;
PRPC_UNICODE_STRING AccountsBuffer = NULL; PRPC_UNICODE_STRING AccountsBuffer = NULL;
ULONG DomainLength; ULONG DomainLength;
ULONG AccountLength;
ULONG i; ULONG i;
LPWSTR Ptr; LPWSTR Ptr;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
@ -728,13 +728,15 @@ LsapSplitNames(DWORD Count,
for (i = 0; i < Count; i++) for (i = 0; i < Count; i++)
{ {
TRACE("Name: %S\n", Names[i].Buffer); //TRACE("Name: %wZ\n", &Names[i]);
Ptr = wcschr(Names[i].Buffer, L'\\'); Ptr = wcschr(Names[i].Buffer, L'\\');
if (Ptr == NULL) if (Ptr == NULL)
{ {
AccountLength = Names[i].Length / sizeof(WCHAR);
AccountsBuffer[i].Length = Names[i].Length; AccountsBuffer[i].Length = Names[i].Length;
AccountsBuffer[i].MaximumLength = Names[i].MaximumLength; AccountsBuffer[i].MaximumLength = AccountsBuffer[i].Length + sizeof(WCHAR);
AccountsBuffer[i].Buffer = MIDL_user_allocate(AccountsBuffer[i].MaximumLength); AccountsBuffer[i].Buffer = MIDL_user_allocate(AccountsBuffer[i].MaximumLength);
if (AccountsBuffer[i].Buffer == NULL) if (AccountsBuffer[i].Buffer == NULL)
{ {
@ -745,13 +747,17 @@ TRACE("Name: %S\n", Names[i].Buffer);
CopyMemory(AccountsBuffer[i].Buffer, CopyMemory(AccountsBuffer[i].Buffer,
Names[i].Buffer, Names[i].Buffer,
AccountsBuffer[i].Length); AccountsBuffer[i].Length);
AccountsBuffer[i].Buffer[AccountsBuffer[i].Length / sizeof(WCHAR)] = UNICODE_NULL; AccountsBuffer[i].Buffer[AccountLength] = UNICODE_NULL;
TRACE("Account name: %S\n", AccountsBuffer[i].Buffer); //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
} }
else else
{ {
DomainLength = (ULONG)((ULONG_PTR)Ptr - (ULONG_PTR)Names[i].Buffer); DomainLength = (ULONG)(ULONG_PTR)(Ptr - Names[i].Buffer);
AccountLength = (Names[i].Length / sizeof(WCHAR)) - DomainLength - 1;
//TRACE("DomainLength: %u\n", DomainLength);
//TRACE("AccountLength: %u\n", AccountLength);
if (DomainLength > 0) if (DomainLength > 0)
{ {
DomainsBuffer[i].Length = (USHORT)DomainLength * sizeof(WCHAR); DomainsBuffer[i].Length = (USHORT)DomainLength * sizeof(WCHAR);
@ -766,12 +772,12 @@ TRACE("Account name: %S\n", AccountsBuffer[i].Buffer);
CopyMemory(DomainsBuffer[i].Buffer, CopyMemory(DomainsBuffer[i].Buffer,
Names[i].Buffer, Names[i].Buffer,
DomainsBuffer[i].Length); DomainsBuffer[i].Length);
DomainsBuffer[i].Buffer[DomainsBuffer[i].Length / sizeof(WCHAR)] = UNICODE_NULL; DomainsBuffer[i].Buffer[DomainLength] = UNICODE_NULL;
TRACE("Domain name: %S\n", DomainsBuffer[i].Buffer); //TRACE("Domain name: %wZ\n", &DomainsBuffer[i]);
} }
AccountsBuffer[i].Length = Names[i].Length - (USHORT)((DomainLength + 1) * sizeof(WCHAR)); AccountsBuffer[i].Length = (USHORT)AccountLength * sizeof(WCHAR);
AccountsBuffer[i].MaximumLength = AccountsBuffer[i].Length + sizeof(WCHAR); AccountsBuffer[i].MaximumLength = AccountsBuffer[i].Length + sizeof(WCHAR);
AccountsBuffer[i].Buffer = MIDL_user_allocate(AccountsBuffer[i].MaximumLength); AccountsBuffer[i].Buffer = MIDL_user_allocate(AccountsBuffer[i].MaximumLength);
if (AccountsBuffer[i].Buffer == NULL) if (AccountsBuffer[i].Buffer == NULL)
@ -783,9 +789,9 @@ TRACE("Domain name: %S\n", DomainsBuffer[i].Buffer);
CopyMemory(AccountsBuffer[i].Buffer, CopyMemory(AccountsBuffer[i].Buffer,
&(Names[i].Buffer[DomainLength + 1]), &(Names[i].Buffer[DomainLength + 1]),
AccountsBuffer[i].Length); AccountsBuffer[i].Length);
AccountsBuffer[i].Buffer[AccountsBuffer[i].Length / sizeof(WCHAR)] = UNICODE_NULL; AccountsBuffer[i].Buffer[AccountLength] = UNICODE_NULL;
TRACE("Account name: %S\n", AccountsBuffer[i].Buffer); //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
} }
} }
@ -849,9 +855,9 @@ LsapLookupNames(DWORD Count,
PWELL_KNOWN_SID ptr; PWELL_KNOWN_SID ptr;
TRACE("\n"); //TRACE("()\n");
TranslatedSids->Entries = Count; TranslatedSids->Entries = 0;
TranslatedSids->Sids = NULL; TranslatedSids->Sids = NULL;
*ReferencedDomains = NULL; *ReferencedDomains = NULL;
@ -859,7 +865,7 @@ TRACE("\n");
SidsBuffer = MIDL_user_allocate(SidsBufferLength); SidsBuffer = MIDL_user_allocate(SidsBufferLength);
if (SidsBuffer == NULL) if (SidsBuffer == NULL)
{ {
TRACE("\n"); //TRACE("\n");
Status = STATUS_INSUFFICIENT_RESOURCES; Status = STATUS_INSUFFICIENT_RESOURCES;
goto done; goto done;
} }
@ -867,20 +873,28 @@ TRACE("\n");
DomainsBuffer = MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST)); DomainsBuffer = MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST));
if (DomainsBuffer == NULL) if (DomainsBuffer == NULL)
{ {
TRACE("\n"); //TRACE("\n");
Status = STATUS_INSUFFICIENT_RESOURCES; Status = STATUS_INSUFFICIENT_RESOURCES;
goto done; goto done;
} }
DomainsBuffer->Entries = Count; DomainsBuffer->Entries = 0; //Count;
DomainsBuffer->Domains = MIDL_user_allocate(Count * sizeof(LSA_TRUST_INFORMATION)); DomainsBuffer->Domains = MIDL_user_allocate(Count * sizeof(LSA_TRUST_INFORMATION));
if (DomainsBuffer->Domains == NULL) if (DomainsBuffer->Domains == NULL)
{ {
TRACE("\n"); //TRACE("\n");
Status = STATUS_INSUFFICIENT_RESOURCES; Status = STATUS_INSUFFICIENT_RESOURCES;
goto done; goto done;
} }
for (i = 0; i < Count; i++)
{
SidsBuffer[i].Use = SidTypeUnknown;
SidsBuffer[i].Sid = NULL;
SidsBuffer[i].DomainIndex = -1;
SidsBuffer[i].Flags = 0;
}
Status = LsapSplitNames(Count, Status = LsapSplitNames(Count,
Names, Names,
&DomainNames, &DomainNames,
@ -893,22 +907,39 @@ TRACE("\n");
for (i = 0; i < Count; i++) for (i = 0; i < Count; i++)
{ {
TRACE("Name: %S\n", Names[i].Buffer); //TRACE("Name: %wZ\n", &Names[i]);
TRACE("Domain name: %S\n", DomainNames[i].Buffer); //TRACE("Domain name: %wZ\n", &DomainNames[i]);
TRACE("Account name: %S\n", AccountNames[i].Buffer); //TRACE("Account name: %wZ\n", &AccountNames[i]);
ptr = LsapLookupWellKnownName(DomainNames[i].Buffer, ptr = LsapLookupWellKnownName((PUNICODE_STRING)&AccountNames[i]);
AccountNames[i].Buffer);
if (ptr != NULL) if (ptr != NULL)
{ {
TRACE("Found well known account!\n"); //TRACE("Found well known account!\n");
SidsBuffer[i].Use = ptr->Use; SidsBuffer[i].Use = ptr->Use;
SidsBuffer[i].Sid = ptr->Sid; SidsBuffer[i].Sid = ptr->Sid;
SidsBuffer[i].DomainIndex = -1; SidsBuffer[i].DomainIndex = -1;
SidsBuffer[i].Flags = 0; SidsBuffer[i].Flags = 0;
#if 0
if (DomainNames[i].Buffer != NULL)
{
ptr2= LsapLookupWellKnownName((PUNICODE_STRING)&DomainNames[i].Buffer);
if (ptr2 != NULL)
{
}
}
else if (ptr->Domain.Length != 0)
{
}
else
{
}
#endif
Mapped++; Mapped++;
continue; continue;
@ -919,10 +950,11 @@ TRACE("Found well known account!\n");
} }
done: done:
TRACE("done: Status %lx\n", Status); // TRACE("done: Status %lx\n", Status);
if (DomainNames != NULL) if (DomainNames != NULL)
{ {
//TRACE("Free DomainNames\n");
for (i = 0; i < Count; i++) for (i = 0; i < Count; i++)
{ {
if (DomainNames[i].Buffer != NULL) if (DomainNames[i].Buffer != NULL)
@ -934,10 +966,14 @@ done:
if (AccountNames != NULL) if (AccountNames != NULL)
{ {
//TRACE("Free AccountNames\n");
for (i = 0; i < Count; i++) for (i = 0; i < Count; i++)
{ {
//TRACE("i: %lu\n", i);
if (AccountNames[i].Buffer != NULL) if (AccountNames[i].Buffer != NULL)
{
MIDL_user_free(AccountNames[i].Buffer); MIDL_user_free(AccountNames[i].Buffer);
}
} }
MIDL_user_free(AccountNames); MIDL_user_free(AccountNames);
@ -945,6 +981,9 @@ done:
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
//TRACE("Failure!\n");
//TRACE("Free DomainsBuffer\n");
if (DomainsBuffer != NULL) if (DomainsBuffer != NULL)
{ {
if (DomainsBuffer->Domains != NULL) if (DomainsBuffer->Domains != NULL)
@ -953,11 +992,17 @@ done:
MIDL_user_free(DomainsBuffer); MIDL_user_free(DomainsBuffer);
} }
//TRACE("Free SidsBuffer\n");
if (SidsBuffer != NULL) if (SidsBuffer != NULL)
MIDL_user_free(SidsBuffer); MIDL_user_free(SidsBuffer);
} }
else else
{ {
//TRACE("Success!\n");
*ReferencedDomains = DomainsBuffer;
TranslatedSids->Entries = Count;
TranslatedSids->Sids = SidsBuffer;
*MappedCount = Mapped; *MappedCount = Mapped;
if (Mapped == 0) if (Mapped == 0)
@ -966,6 +1011,8 @@ done:
Status = STATUS_SOME_NOT_MAPPED; Status = STATUS_SOME_NOT_MAPPED;
} }
// TRACE("done: Status %lx\n", Status);
return Status; return Status;
} }