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