mirror of
https://github.com/reactos/reactos.git
synced 2025-04-22 13:10:39 +00:00
[LSASRV]
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:
parent
48028ca4f0
commit
e0103d4c59
1 changed files with 73 additions and 26 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue