From e9e4da8f3647e3c47afef5ccba38779c342cb008 Mon Sep 17 00:00:00 2001 From: Paul Bryan Roberts Date: Sat, 18 Oct 2008 20:46:35 +0100 Subject: [PATCH] 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 59275c8cc5a..87dca9beddb 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 7ec03b28bdb..4e9e7ef0742 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;