mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 06:46:06 +00:00
[advapi32]
Alexander Yastrebov <menone7@gmail.com> - Return proper lengths of required buffer sizes in characters (including the termination NULL character) in LookupAccountSid. Fixes 4 "advapi32_winetest security" failures. See issue #4904 for more details. svn path=/trunk/; revision=44117
This commit is contained in:
parent
ba319b373f
commit
14442c0a34
1 changed files with 29 additions and 40 deletions
|
@ -1146,6 +1146,7 @@ LookupAccountSidW(LPCWSTR pSystemName,
|
||||||
PLSA_REFERENCED_DOMAIN_LIST ReferencedDomain = NULL;
|
PLSA_REFERENCED_DOMAIN_LIST ReferencedDomain = NULL;
|
||||||
PLSA_TRANSLATED_NAME TranslatedName = NULL;
|
PLSA_TRANSLATED_NAME TranslatedName = NULL;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
|
DWORD dwAccountName, dwDomainName;
|
||||||
|
|
||||||
RtlInitUnicodeString ( &SystemName, pSystemName );
|
RtlInitUnicodeString ( &SystemName, pSystemName );
|
||||||
Status = LsaOpenPolicy ( &SystemName, &ObjectAttributes, POLICY_LOOKUP_NAMES, &PolicyHandle );
|
Status = LsaOpenPolicy ( &SystemName, &ObjectAttributes, POLICY_LOOKUP_NAMES, &PolicyHandle );
|
||||||
|
@ -1166,49 +1167,37 @@ LookupAccountSidW(LPCWSTR pSystemName,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
if ( TranslatedName )
|
|
||||||
|
dwAccountName = TranslatedName->Name.Length / sizeof(WCHAR);
|
||||||
|
if (ReferencedDomain && ReferencedDomain->Entries > 0)
|
||||||
|
dwDomainName = ReferencedDomain->Domains[0].Name.Length / sizeof(WCHAR);
|
||||||
|
else
|
||||||
|
dwDomainName = 0;
|
||||||
|
|
||||||
|
if (*pdwAccountName <= dwAccountName || *pdwDomainName <= dwDomainName)
|
||||||
{
|
{
|
||||||
DWORD dwSrcLen = TranslatedName->Name.Length / sizeof(WCHAR);
|
/* One or two buffers are insufficient, add up a char for NULL termination */
|
||||||
if ( *pdwAccountName <= dwSrcLen )
|
*pdwAccountName = dwAccountName + 1;
|
||||||
{
|
*pdwDomainName = dwDomainName + 1;
|
||||||
*pdwAccountName = dwSrcLen + 1;
|
ret = FALSE;
|
||||||
ret = FALSE;
|
} else
|
||||||
}
|
{
|
||||||
else
|
/* Lengths are sufficient, copy the data */
|
||||||
{
|
if(dwAccountName)
|
||||||
*pdwAccountName = dwSrcLen;
|
RtlCopyMemory(pAccountName, TranslatedName->Name.Buffer, dwAccountName * sizeof(WCHAR));
|
||||||
if (pAccountName)
|
pAccountName[dwAccountName] = L'\0';
|
||||||
{
|
|
||||||
RtlCopyMemory ( pAccountName, TranslatedName->Name.Buffer, TranslatedName->Name.Length );
|
if(dwDomainName)
|
||||||
pAccountName[TranslatedName->Name.Length / sizeof(WCHAR)] = L'\0';
|
RtlCopyMemory(pDomainName, ReferencedDomain->Domains[0].Name.Buffer, dwDomainName * sizeof(WCHAR));
|
||||||
}
|
pDomainName[dwDomainName] = L'\0';
|
||||||
}
|
|
||||||
if ( peUse )
|
*pdwAccountName = dwAccountName;
|
||||||
|
*pdwDomainName = dwDomainName;
|
||||||
|
|
||||||
|
if (peUse)
|
||||||
*peUse = TranslatedName->Use;
|
*peUse = TranslatedName->Use;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ReferencedDomain )
|
|
||||||
{
|
|
||||||
if ( ReferencedDomain->Entries > 0 )
|
|
||||||
{
|
|
||||||
DWORD dwSrcLen = ReferencedDomain->Domains[0].Name.Length / sizeof(WCHAR);
|
|
||||||
if ( *pdwDomainName <= dwSrcLen )
|
|
||||||
{
|
|
||||||
*pdwDomainName = dwSrcLen + 1;
|
|
||||||
ret = FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*pdwDomainName = dwSrcLen;
|
|
||||||
if (pDomainName)
|
|
||||||
{
|
|
||||||
RtlCopyMemory ( pDomainName, ReferencedDomain->Domains[0].Name.Buffer, ReferencedDomain->Domains[0].Name.Length );
|
|
||||||
pDomainName[ReferencedDomain->Domains[0].Name.Length / sizeof(WCHAR)] = L'\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !ret )
|
if ( !ret )
|
||||||
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue