[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:
Aleksey Bragin 2009-11-12 13:55:51 +00:00
parent ba319b373f
commit 14442c0a34

View file

@ -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);
} }