diff --git a/dlls/advapi32/advapi.c b/dlls/advapi32/advapi.c
index 26f9a1ce9a8055e0b4ef967a132683778068b627..7f9e99dd3ca7d3d34a8a54a495bc0b7b8703807d 100644
--- a/dlls/advapi32/advapi.c
+++ b/dlls/advapi32/advapi.c
@@ -4,6 +4,7 @@
  * Copyright 1995 Sven Verdoolaege
  */
 
+#include <errno.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
@@ -16,9 +17,13 @@
 
 #include "debugtools.h"
 
+DEFAULT_DEBUG_CHANNEL(advapi);
 
 /******************************************************************************
  * GetUserNameA [ADVAPI32.@]
+ *
+ * NOTE: lpSize returns the total length of the username, including the
+ * terminating null character.
  */
 BOOL WINAPI
 GetUserNameA( LPSTR lpszName, LPDWORD lpSize )
@@ -27,14 +32,24 @@ GetUserNameA( LPSTR lpszName, LPDWORD lpSize )
   char *name;
 
   struct passwd *pwd = getpwuid( getuid() );
-  if (!pwd) return 0;
+  if (!pwd)
+  {
+    ERR("Username lookup failed: %s\n", strerror(errno));
+    return 0;
+  }
+
   name = pwd->pw_name;
-  len = name ? strlen(name) : 0;
-  if (!len || !lpSize || len > *lpSize) {
-    if (lpszName) *lpszName = 0;
+
+  /* We need to include the null character when determining the size of the buffer. */
+  len = strlen(name) + 1;
+  if (len > *lpSize)
+  {
+    SetLastError(ERROR_MORE_DATA);
+    *lpSize = len;
     return 0;
   }
-  *lpSize=len;
+
+  *lpSize = len;
   strcpy(lpszName, name);
   return 1;
 }