From: Piotr Caban piotr@codeweavers.com
--- dlls/advapi32/security.c | 6 +++--- dlls/advapi32/tests/lsa.c | 26 +++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index e0e106ebb1c..d9a8b6832cd 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -1343,7 +1343,7 @@ BOOL lookup_local_user_name( const LSA_UNICODE_STRING *account_and_domain, { /* check to make sure this account is on this computer */ if (GetComputerNameW( userName, &nameLen ) && - (domain.Length / sizeof(WCHAR) != nameLen || wcsncmp( domain.Buffer, userName, nameLen ))) + (domain.Length / sizeof(WCHAR) != nameLen || wcsnicmp( domain.Buffer, userName, nameLen ))) { SetLastError(ERROR_NONE_MAPPED); ret = FALSE; @@ -1352,7 +1352,7 @@ BOOL lookup_local_user_name( const LSA_UNICODE_STRING *account_and_domain, }
if (GetUserNameW( userName, &nameLen ) && - account.Length / sizeof(WCHAR) == nameLen - 1 && !wcsncmp( account.Buffer, userName, nameLen - 1 )) + account.Length / sizeof(WCHAR) == nameLen - 1 && !wcsnicmp( account.Buffer, userName, nameLen - 1 )) { ret = lookup_user_account_name( Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse ); *handled = TRUE; @@ -1361,7 +1361,7 @@ BOOL lookup_local_user_name( const LSA_UNICODE_STRING *account_and_domain, { nameLen = UNLEN + 1; if (GetComputerNameW( userName, &nameLen ) && - account.Length / sizeof(WCHAR) == nameLen && !wcsncmp( account.Buffer, userName , nameLen )) + account.Length / sizeof(WCHAR) == nameLen && !wcsnicmp( account.Buffer, userName , nameLen )) { ret = lookup_computer_account_name( Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse ); *handled = TRUE; diff --git a/dlls/advapi32/tests/lsa.c b/dlls/advapi32/tests/lsa.c index 16697ebae4b..aeda0fcb65f 100644 --- a/dlls/advapi32/tests/lsa.c +++ b/dlls/advapi32/tests/lsa.c @@ -213,8 +213,10 @@ static void test_LsaLookupNames2(void) LSA_OBJECT_ATTRIBUTES attrs; PLSA_REFERENCED_DOMAIN_LIST domains; PLSA_TRANSLATED_SID2 sids; - LSA_UNICODE_STRING name[3]; + LSA_UNICODE_STRING name[4]; LPSTR account, sid_dom; + DWORD len; + BOOL ret;
if ((PRIMARYLANGID(LANGIDFROMLCID(GetSystemDefaultLCID())) != LANG_ENGLISH) || (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) != LANG_ENGLISH)) @@ -255,6 +257,14 @@ static void test_LsaLookupNames2(void) name[2].Length = name[2].MaximumLength = sizeof(n2); memcpy(name[2].Buffer, n2, sizeof(n2));
+ ret = GetUserNameW(NULL, &len); + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "GetUserNameW returned %x (%lu)\n", ret, GetLastError()); + name[3].Buffer = malloc(len * sizeof(WCHAR)); + name[3].Length = name[3].MaximumLength = (len - 1) * sizeof(WCHAR); + ret = GetUserNameW(name[3].Buffer, &len); + ok(ret, "GetUserNameW returned %x (%lu)\n", ret, GetLastError()); + /* account name only */ sids = NULL; domains = NULL; @@ -307,9 +317,23 @@ static void test_LsaLookupNames2(void) LsaFreeMemory(sids); LsaFreeMemory(domains);
+ /* case mismatch */ + name[3].Buffer[0] = iswlower(name[3].Buffer[0]) ? + towupper(name[3].Buffer[0]) : tolower(name[3].Buffer[0]); + sids = NULL; + domains = NULL; + status = LsaLookupNames2(handle, 0, 1, &name[3], &domains, &sids); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %lx)\n", status); + ok(sids[0].Use == SidTypeUser, "expected SidTypeUser, got %u\n", sids[0].Use); + ok(sids[0].Flags == 0, "expected 0, got 0x%08lx\n", sids[0].Flags); + ok(domains->Entries == 1, "expected 1, got %lu\n", domains->Entries); + LsaFreeMemory(sids); + LsaFreeMemory(domains); + free(name[0].Buffer); free(name[1].Buffer); free(name[2].Buffer); + free(name[3].Buffer);
status = LsaClose(handle); ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08lx\n", status);