advapi32: Fix LookupAccountSid and tests to pass on windows and wine.

This commit is contained in:
Robert Reif 2006-08-25 18:14:58 -04:00 committed by Alexandre Julliard
parent ee32bd99dd
commit f0085e6376
2 changed files with 150 additions and 58 deletions

View File

@ -1854,14 +1854,14 @@ LookupAccountSidA(
WideCharToMultiByte( CP_ACP, 0, accountW, -1, account, len, NULL, NULL ); WideCharToMultiByte( CP_ACP, 0, accountW, -1, account, len, NULL, NULL );
*accountSize = len; *accountSize = len;
} else } else
*accountSize = accountSizeW; *accountSize = accountSizeW + 1;
if (domainW && *domainSize) { if (domainW && *domainSize) {
len = WideCharToMultiByte( CP_ACP, 0, domainW, -1, NULL, 0, NULL, NULL ); len = WideCharToMultiByte( CP_ACP, 0, domainW, -1, NULL, 0, NULL, NULL );
WideCharToMultiByte( CP_ACP, 0, domainW, -1, domain, len, NULL, NULL ); WideCharToMultiByte( CP_ACP, 0, domainW, -1, domain, len, NULL, NULL );
*domainSize = len; *domainSize = len;
} else } else
*domainSize = domainSizeW; *domainSize = domainSizeW + 1;
} }
HeapFree( GetProcessHeap(), 0, systemW ); HeapFree( GetProcessHeap(), 0, systemW );
@ -2007,10 +2007,16 @@ LookupAccountSidW(
} }
if (((*accountSize != 0) && (*accountSize < strlenW(ac))) || if (((*accountSize != 0) && (*accountSize < strlenW(ac))) ||
((*domainSize != 0) && (*domainSize < strlenW(dm)))) { ((*domainSize != 0) && (*domainSize < strlenW(dm)))) {
SetLastError(ERROR_NOT_ENOUGH_MEMORY); SetLastError(ERROR_INSUFFICIENT_BUFFER);
status = FALSE; status = FALSE;
} }
if (*domainSize)
*domainSize = strlenW(dm);
else
*domainSize = strlenW(dm) + 1; *domainSize = strlenW(dm) + 1;
if (*accountSize)
*accountSize = strlenW(ac);
else
*accountSize = strlenW(ac) + 1; *accountSize = strlenW(ac) + 1;
*name_use = use; *name_use = use;
HeapFree(GetProcessHeap(), 0, computer_name); HeapFree(GetProcessHeap(), 0, computer_name);

View File

@ -878,15 +878,18 @@ static void test_sid_str(PSID * sid)
static void test_LookupAccountSid(void) static void test_LookupAccountSid(void)
{ {
SID_IDENTIFIER_AUTHORITY SIDAuthNT = { SECURITY_NT_AUTHORITY }; SID_IDENTIFIER_AUTHORITY SIDAuthNT = { SECURITY_NT_AUTHORITY };
char account[MAX_PATH], domain[MAX_PATH]; CHAR accountA[MAX_PATH], domainA[MAX_PATH];
DWORD acc_size, dom_size; DWORD acc_sizeA, dom_sizeA;
DWORD real_acc_size, real_dom_size; DWORD real_acc_sizeA, real_dom_sizeA;
WCHAR accountW[MAX_PATH], domainW[MAX_PATH];
DWORD acc_sizeW, dom_sizeW;
DWORD real_acc_sizeW, real_dom_sizeW;
PSID pUsersSid = NULL; PSID pUsersSid = NULL;
SID_NAME_USE use; SID_NAME_USE use;
BOOL ret; BOOL ret;
DWORD size; DWORD size;
MAX_SID max_sid; MAX_SID max_sid;
char *str_sid; CHAR *str_sidA;
int i; int i;
/* native windows crashes if account size, domain size, or name use is NULL */ /* native windows crashes if account size, domain size, or name use is NULL */
@ -900,68 +903,151 @@ static void test_LookupAccountSid(void)
if (!ret && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) if (!ret && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED))
return; return;
real_acc_size = MAX_PATH; real_acc_sizeA = MAX_PATH;
real_dom_size = MAX_PATH; real_dom_sizeA = MAX_PATH;
ret = LookupAccountSidA(NULL, pUsersSid, account, &real_acc_size, domain, &real_dom_size, &use); ret = LookupAccountSidA(NULL, pUsersSid, accountA, &real_acc_sizeA, domainA, &real_dom_sizeA, &use);
ok(ret, "LookupAccountSid() Expected TRUE, got FALSE\n"); ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
/* try NULL account */ /* try NULL account */
acc_size = MAX_PATH; acc_sizeA = MAX_PATH;
dom_size = MAX_PATH; dom_sizeA = MAX_PATH;
ret = LookupAccountSidA(NULL, pUsersSid, NULL, &acc_size, domain, &dom_size, &use); ret = LookupAccountSidA(NULL, pUsersSid, NULL, &acc_sizeA, domainA, &dom_sizeA, &use);
ok(ret, "LookupAccountSid() Expected TRUE, got FALSE\n"); ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
/* try NULL domain */ /* try NULL domain */
acc_size = MAX_PATH; acc_sizeA = MAX_PATH;
dom_size = MAX_PATH; dom_sizeA = MAX_PATH;
ret = LookupAccountSidA(NULL, pUsersSid, account, &acc_size, NULL, &dom_size, &use); ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, NULL, &dom_sizeA, &use);
ok(ret, "LookupAccountSid() Expected TRUE, got FALSE\n"); ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
/* try a small account buffer */ /* try a small account buffer */
acc_size = 1; acc_sizeA = 1;
dom_size = MAX_PATH; dom_sizeA = MAX_PATH;
account[0] = 0; accountA[0] = 0;
ret = LookupAccountSidA(NULL, pUsersSid, account, &acc_size, domain, &dom_size, &use); ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
ok(!ret, "LookupAccountSid() Expected FALSE got TRUE\n"); ok(!ret, "LookupAccountSidA() Expected FALSE got TRUE\n");
ok(GetLastError() == ERROR_NOT_ENOUGH_MEMORY, "LookupAccountSid() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError()); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"LookupAccountSidA() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
/* try a 0 sized account buffer */ /* try a 0 sized account buffer */
acc_size = 0; acc_sizeA = 0;
dom_size = MAX_PATH; dom_sizeA = MAX_PATH;
account[0] = 0; accountA[0] = 0;
ret = LookupAccountSidA(NULL, pUsersSid, account, &acc_size, domain, &dom_size, &use); ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
/* this can fail or succeed depending on OS version but the size will always be returned */ /* this can fail or succeed depending on OS version but the size will always be returned */
ok(acc_size == real_acc_size, "LookupAccountSid() Expected acc_size = %lu, got %lu\n", real_acc_size, acc_size); ok(acc_sizeA == real_acc_sizeA + 1,
"LookupAccountSidA() Expected acc_size = %lu, got %lu\n",
real_acc_sizeA + 1, acc_sizeA);
/* try a 0 sized account buffer */ /* try a 0 sized account buffer */
acc_size = 0; acc_sizeA = 0;
dom_size = MAX_PATH; dom_sizeA = MAX_PATH;
ret = LookupAccountSidA(NULL, pUsersSid, NULL, &acc_size, domain, &dom_size, &use); ret = LookupAccountSidA(NULL, pUsersSid, NULL, &acc_sizeA, domainA, &dom_sizeA, &use);
/* this can fail or succeed depending on OS version but the size will always be returned */ /* this can fail or succeed depending on OS version but the size will always be returned */
ok(acc_size == real_acc_size, "LookupAccountSid() Expected acc_size = %lu, got %lu\n", real_acc_size, acc_size); ok(acc_sizeA == real_acc_sizeA + 1,
"LookupAccountSid() Expected acc_size = %lu, got %lu\n",
real_acc_sizeA + 1, acc_sizeA);
/* try a small domain buffer */ /* try a small domain buffer */
dom_size = 1; dom_sizeA = 1;
acc_size = MAX_PATH; acc_sizeA = MAX_PATH;
account[0] = 0; accountA[0] = 0;
ret = LookupAccountSidA(NULL, pUsersSid, account, &acc_size, domain, &dom_size, &use); ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
ok(!ret, "LookupAccountSid() Expected FALSE got TRUE\n"); ok(!ret, "LookupAccountSidA() Expected FALSE got TRUE\n");
ok(GetLastError() == ERROR_NOT_ENOUGH_MEMORY, "LookupAccountSid() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError()); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"LookupAccountSidA() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
/* try a 0 sized domain buffer */ /* try a 0 sized domain buffer */
dom_size = 0; dom_sizeA = 0;
acc_size = MAX_PATH; acc_sizeA = MAX_PATH;
account[0] = 0; accountA[0] = 0;
ret = LookupAccountSidA(NULL, pUsersSid, account, &acc_size, domain, &dom_size, &use); ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
/* this can fail or succeed depending on OS version but the size will always be returned */ /* this can fail or succeed depending on OS version but the size will always be returned */
ok(dom_size == real_dom_size, "LookupAccountSid() Expected dom_size = %lu, got %lu\n", real_dom_size, dom_size); ok(dom_sizeA == real_dom_sizeA + 1,
"LookupAccountSidA() Expected dom_size = %lu, got %lu\n",
real_dom_sizeA + 1, dom_sizeA);
/* try a 0 sized domain buffer */ /* try a 0 sized domain buffer */
dom_size = 0; dom_sizeA = 0;
acc_size = MAX_PATH; acc_sizeA = MAX_PATH;
ret = LookupAccountSidA(NULL, pUsersSid, account, &acc_size, NULL, &dom_size, &use); ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, NULL, &dom_sizeA, &use);
/* this can fail or succeed depending on OS version but the size will always be returned */ /* this can fail or succeed depending on OS version but the size will always be returned */
ok(acc_size == real_acc_size, "LookupAccountSid() Expected dom_size = %lu, got %lu\n", real_dom_size, dom_size); ok(dom_sizeA == real_dom_sizeA + 1,
"LookupAccountSidA() Expected dom_size = %lu, got %lu\n",
real_dom_sizeA + 1, dom_sizeA);
real_acc_sizeW = MAX_PATH;
real_dom_sizeW = MAX_PATH;
ret = LookupAccountSidW(NULL, pUsersSid, accountW, &real_acc_sizeW, domainW, &real_dom_sizeW, &use);
ok(ret, "LookupAccountSidW() Expected TRUE, got FALSE\n");
/* try NULL account */
acc_sizeW = MAX_PATH;
dom_sizeW = MAX_PATH;
ret = LookupAccountSidW(NULL, pUsersSid, NULL, &acc_sizeW, domainW, &dom_sizeW, &use);
ok(ret, "LookupAccountSidW() Expected TRUE, got FALSE\n");
/* try NULL domain */
acc_sizeW = MAX_PATH;
dom_sizeW = MAX_PATH;
ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, NULL, &dom_sizeW, &use);
ok(ret, "LookupAccountSidW() Expected TRUE, got FALSE\n");
/* try a small account buffer */
acc_sizeW = 1;
dom_sizeW = MAX_PATH;
accountW[0] = 0;
ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
ok(!ret, "LookupAccountSidW() Expected FALSE got TRUE\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"LookupAccountSidW() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
/* try a 0 sized account buffer */
acc_sizeW = 0;
dom_sizeW = MAX_PATH;
accountW[0] = 0;
ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
/* this can fail or succeed depending on OS version but the size will always be returned */
ok(acc_sizeW == real_acc_sizeW + 1,
"LookupAccountSidW() Expected acc_size = %lu, got %lu\n",
real_acc_sizeW + 1, acc_sizeW);
/* try a 0 sized account buffer */
acc_sizeW = 0;
dom_sizeW = MAX_PATH;
ret = LookupAccountSidW(NULL, pUsersSid, NULL, &acc_sizeW, domainW, &dom_sizeW, &use);
/* this can fail or succeed depending on OS version but the size will always be returned */
ok(acc_sizeW == real_acc_sizeW + 1,
"LookupAccountSidW() Expected acc_size = %lu, got %lu\n",
real_acc_sizeW + 1, acc_sizeW);
/* try a small domain buffer */
dom_sizeW = 1;
acc_sizeW = MAX_PATH;
accountW[0] = 0;
ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
ok(!ret, "LookupAccountSidW() Expected FALSE got TRUE\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"LookupAccountSidW() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
/* try a 0 sized domain buffer */
dom_sizeW = 0;
acc_sizeW = MAX_PATH;
accountW[0] = 0;
ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
/* this can fail or succeed depending on OS version but the size will always be returned */
ok(dom_sizeW == real_dom_sizeW + 1,
"LookupAccountSidW() Expected dom_size = %lu, got %lu\n",
real_dom_sizeW + 1, dom_sizeW);
/* try a 0 sized domain buffer */
dom_sizeW = 0;
acc_sizeW = MAX_PATH;
ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, NULL, &dom_sizeW, &use);
/* this can fail or succeed depending on OS version but the size will always be returned */
ok(dom_sizeW == real_dom_sizeW + 1,
"LookupAccountSidW() Expected dom_size = %lu, got %lu\n",
real_dom_sizeW + 1, dom_sizeW);
pCreateWellKnownSid = (fnCreateWellKnownSid)GetProcAddress( hmod, "CreateWellKnownSid" ); pCreateWellKnownSid = (fnCreateWellKnownSid)GetProcAddress( hmod, "CreateWellKnownSid" );
@ -973,13 +1059,13 @@ static void test_LookupAccountSid(void)
size = SECURITY_MAX_SID_SIZE; size = SECURITY_MAX_SID_SIZE;
if (pCreateWellKnownSid(i, NULL, &max_sid.sid, &size)) if (pCreateWellKnownSid(i, NULL, &max_sid.sid, &size))
{ {
if (pConvertSidToStringSidA(&max_sid.sid, &str_sid)) if (pConvertSidToStringSidA(&max_sid.sid, &str_sidA))
{ {
acc_size = MAX_PATH; acc_sizeA = MAX_PATH;
dom_size = MAX_PATH; dom_sizeA = MAX_PATH;
if (LookupAccountSid(NULL, &max_sid.sid, account, &acc_size, domain, &dom_size, &use)) if (LookupAccountSidA(NULL, &max_sid.sid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use))
trace(" %d: %s %s\\%s %d\n", i, str_sid, domain, account, use); trace(" %d: %s %s\\%s %d\n", i, str_sidA, domainA, accountA, use);
LocalFree(str_sid); LocalFree(str_sidA);
} }
} }
else else