Andrew Nguyen : advapi32: Fix last error value of GetUserNameA/ W and output buffer handling in GetUserNameA.
Alexandre Julliard
julliard at winehq.org
Wed Jun 1 12:11:08 CDT 2011
Module: wine
Branch: master
Commit: c0b7345e386ac1ccc1e99577cc85093f05c55631
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c0b7345e386ac1ccc1e99577cc85093f05c55631
Author: Andrew Nguyen <anguyen at codeweavers.com>
Date: Wed Jun 1 07:13:57 2011 -0500
advapi32: Fix last error value of GetUserNameA/W and output buffer handling in GetUserNameA.
---
dlls/advapi32/advapi.c | 18 +++++++-----------
dlls/advapi32/tests/security.c | 10 ----------
2 files changed, 7 insertions(+), 21 deletions(-)
diff --git a/dlls/advapi32/advapi.c b/dlls/advapi32/advapi.c
index 47286a1..e135fa5 100644
--- a/dlls/advapi32/advapi.c
+++ b/dlls/advapi32/advapi.c
@@ -55,24 +55,20 @@ GetUserNameA( LPSTR lpszName, LPDWORD lpSize )
{
WCHAR *buffer;
BOOL ret;
- DWORD sizeW = *lpSize * 2;
+ DWORD sizeW = *lpSize;
if (!(buffer = HeapAlloc( GetProcessHeap(), 0, sizeW * sizeof(WCHAR) )))
{
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
return FALSE;
}
+
ret = GetUserNameW( buffer, &sizeW );
if (ret)
- {
- if (!(*lpSize = WideCharToMultiByte( CP_ACP, 0, buffer, -1, lpszName, *lpSize, NULL, NULL )))
- {
- *lpSize = WideCharToMultiByte( CP_ACP, 0, buffer, -1, NULL, 0, NULL, NULL );
- SetLastError( ERROR_MORE_DATA );
- ret = FALSE;
- }
- }
- else *lpSize = sizeW * 2;
+ WideCharToMultiByte( CP_ACP, 0, buffer, -1, lpszName, *lpSize, NULL, NULL );
+ else
+ *lpSize = sizeW;
+
HeapFree( GetProcessHeap(), 0, buffer );
return ret;
}
@@ -91,7 +87,7 @@ GetUserNameW( LPWSTR lpszName, LPDWORD lpSize )
if (len > *lpSize)
{
- SetLastError(ERROR_MORE_DATA);
+ SetLastError( ERROR_INSUFFICIENT_BUFFER );
*lpSize = len;
return FALSE;
}
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index 1d677ac..6a9a1d2 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -3741,7 +3741,6 @@ static void test_GetUserNameA(void)
ret = GetUserNameA(NULL, &required_len);
ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
ok(required_len != 0, "Outputted buffer length was %u\n", required_len);
- todo_wine
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
SetLastError(0xdeadbeef);
@@ -3749,7 +3748,6 @@ static void test_GetUserNameA(void)
ret = GetUserNameA(NULL, &required_len);
ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
ok(required_len != 0 && required_len != 1, "Outputted buffer length was %u\n", required_len);
- todo_wine
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
/* Tests crashes on Windows. */
@@ -3774,7 +3772,6 @@ static void test_GetUserNameA(void)
ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was altered\n");
ok(required_len != 0, "Outputted buffer length was %u\n", required_len);
- todo_wine
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
SetLastError(0xdeadbeef);
@@ -3783,7 +3780,6 @@ static void test_GetUserNameA(void)
ret = GetUserNameA(buffer, &buffer_len);
ok(ret == TRUE, "GetUserNameA returned %d, last error %u\n", ret, GetLastError());
ok(memcmp(buffer, filler, sizeof(filler)) != 0, "Output buffer was untouched\n");
- todo_wine
ok(buffer_len == required_len ||
broken(buffer_len == required_len / sizeof(WCHAR)), /* XP+ */
"Outputted buffer length was %u\n", buffer_len);
@@ -3795,11 +3791,9 @@ static void test_GetUserNameA(void)
buffer_len--;
ret = GetUserNameA(buffer, &buffer_len);
ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
- todo_wine {
ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was untouched\n");
ok(buffer_len == required_len, "Outputted buffer length was %u\n", buffer_len);
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
- }
}
static void test_GetUserNameW(void)
@@ -3820,7 +3814,6 @@ static void test_GetUserNameW(void)
ret = GetUserNameW(NULL, &required_len);
ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
ok(required_len != 0, "Outputted buffer length was %u\n", required_len);
- todo_wine
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
SetLastError(0xdeadbeef);
@@ -3828,7 +3821,6 @@ static void test_GetUserNameW(void)
ret = GetUserNameW(NULL, &required_len);
ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
ok(required_len != 0 && required_len != 1, "Outputted buffer length was %u\n", required_len);
- todo_wine
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
/* Tests crash on Windows. */
@@ -3851,7 +3843,6 @@ static void test_GetUserNameW(void)
ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was altered\n");
ok(required_len != 0, "Outputted buffer length was %u\n", required_len);
- todo_wine
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
SetLastError(0xdeadbeef);
@@ -3872,7 +3863,6 @@ static void test_GetUserNameW(void)
broken(memcmp(buffer, filler, sizeof(filler)) != 0), /* XP+ */
"Output buffer was altered\n");
ok(buffer_len == required_len, "Outputted buffer length was %u\n", buffer_len);
- todo_wine
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %u\n", GetLastError());
}
More information about the wine-cvs
mailing list