Module: wine Branch: master Commit: e9e4da8f3647e3c47afef5ccba38779c342cb008 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e9e4da8f3647e3c47afef5ccba...
Author: Paul Bryan Roberts pbronline-wine@yahoo.co.uk Date: Sat Oct 18 20:46:35 2008 +0100
advapi32: LookupAccountNameW() - return correct domain name length for not-so-well-known SIDs.
---
dlls/advapi32/security.c | 25 ++++++++++++++++--------- dlls/advapi32/tests/security.c | 6 ++---- 2 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index 59275c8..87dca9b 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -2502,8 +2502,8 @@ LookupAccountNameA(
if (ret && lpReferencedDomainNameW) { - WideCharToMultiByte(CP_ACP, 0, lpReferencedDomainNameW, *cbReferencedDomainName, - ReferencedDomainName, *cbReferencedDomainName, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, lpReferencedDomainNameW, -1, + ReferencedDomainName, *cbReferencedDomainName+1, NULL, NULL); }
RtlFreeUnicodeString(&lpSystemW); @@ -2526,6 +2526,8 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI PSID pSid; static const WCHAR dm[] = {'D','O','M','A','I','N',0}; unsigned int i; + DWORD nameLen; + LPCWSTR domainName;
FIXME("%s %s %p %p %p %p %p - stub\n", debugstr_w(lpSystemName), debugstr_w(lpAccountName), Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse); @@ -2566,17 +2568,22 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI ret = FALSE; } *cbSid = GetLengthSid(pSid); - - if (ReferencedDomainName != NULL && (*cchReferencedDomainName > strlenW(dm))) - strcpyW(ReferencedDomainName, dm);
- if (*cchReferencedDomainName <= strlenW(dm)) + domainName = dm; + nameLen = strlenW(domainName); + + if (*cchReferencedDomainName <= nameLen || !ret) { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - ret = FALSE; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + nameLen += 1; + ret = FALSE; + } + else if (ReferencedDomainName && domainName) + { + strcpyW(ReferencedDomainName, domainName); }
- *cchReferencedDomainName = strlenW(dm)+1; + *cchReferencedDomainName = nameLen;
if (ret) { diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index 7ec03b2..4e9e7ef 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -1554,9 +1554,9 @@ static void test_LookupAccountName(void) { ok(!lstrcmp(account, user_name), "Expected %s, got %s\n", user_name, account); ok(!lstrcmp(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain); - ok(domain_size == domain_save - 1, "Expected %d, got %d\n", domain_save - 1, domain_size); - ok(lstrlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size); } + ok(domain_size == domain_save - 1, "Expected %d, got %d\n", domain_save - 1, domain_size); + ok(lstrlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size); ok(sid_use == SidTypeUser, "Expected SidTypeUser (%d), got %d\n", SidTypeUser, sid_use); domain_size = domain_save; sid_size = sid_save; @@ -1572,10 +1572,8 @@ static void test_LookupAccountName(void) ok(ret, "Failed to lookup account name\n"); ok(sid_size != 0, "sid_size was zero\n"); ok(!lstrcmp(account, "Everyone"), "Expected Everyone, got %s\n", account); - todo_wine ok(!lstrcmp(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain); ok(domain_size == 0, "Expected 0, got %d\n", domain_size); - todo_wine ok(lstrlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size); ok(sid_use == SidTypeWellKnownGroup, "Expected SidTypeWellKnownGroup (%d), got %d\n", SidTypeWellKnownGroup, sid_use); domain_size = domain_save;