Index: dll/win32/advapi32/sec/misc.c =================================================================== --- dll/win32/advapi32/sec/misc.c (revision 43511) +++ dll/win32/advapi32/sec/misc.c (working copy) @@ -1165,50 +1165,32 @@ } else { + DWORD dwAccountName,dwDomainName; ret = TRUE; - if ( TranslatedName ) - { - DWORD dwSrcLen = TranslatedName->Name.Length / sizeof(WCHAR); - if ( *pdwAccountName <= dwSrcLen ) - { - *pdwAccountName = dwSrcLen + 1; - ret = FALSE; - } - else - { - *pdwAccountName = dwSrcLen; - if (pAccountName) - { - RtlCopyMemory ( pAccountName, TranslatedName->Name.Buffer, TranslatedName->Name.Length ); - pAccountName[TranslatedName->Name.Length / sizeof(WCHAR)] = L'\0'; - } - } - if ( peUse ) + + dwAccountName = TranslatedName->Name.Length / sizeof(WCHAR); + dwDomainName = (ReferencedDomain && ReferencedDomain->Entries > 0) ? ReferencedDomain->Domains[0].Name.Length / sizeof(WCHAR) : 0; + + if (*pdwAccountName <= dwAccountName || *pdwDomainName <= dwDomainName) { + *pdwAccountName = dwAccountName + 1; + *pdwDomainName = dwDomainName + 1; + ret = FALSE; + } else { + if(dwAccountName) + RtlCopyMemory(pAccountName, TranslatedName->Name.Buffer, dwAccountName * sizeof(WCHAR)); + pAccountName[dwAccountName] = L'\0'; + + if(dwDomainName) + RtlCopyMemory(pDomainName, ReferencedDomain->Domains[0].Name.Buffer, dwDomainName * sizeof(WCHAR)); + pDomainName[dwDomainName] = L'\0'; + + *pdwAccountName = dwAccountName; + *pdwDomainName = dwDomainName; + + if (peUse) *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 ) SetLastError(ERROR_INSUFFICIENT_BUFFER); }