LookupAccountNameW() returns correct domainname length for not-so-well-known SIDs
Paul Bryan Roberts
pbronline-wine at yahoo.co.uk
Thu Sep 25 16:23:31 CDT 2008
---
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 3543f15..9df5b45 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -2498,8 +2498,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);
@@ -2522,6 +2522,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;
+ size_t nameLen;
+ LPCWSTR domainName;
FIXME("%s %s %p %p %p %p %p - stub\n", debugstr_w(lpSystemName), debugstr_w(lpAccountName),
Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse);
@@ -2562,17 +2564,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 8b94086..f46f89c 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -1550,9 +1550,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, got %d\n", sid_use);
domain_size = domain_save;
sid_size = sid_save;
@@ -1568,10 +1568,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 SidTypeUser, got %d\n", sid_use);
domain_size = domain_save;
--
1.5.4.3
--------------040608030901060306090205--
More information about the wine-patches
mailing list