GetUserName should include terminating NULL in length

James Juran jamesjuran at alumni.psu.edu
Sun Nov 18 12:18:55 CST 2001


James Juran <jamesjuran at alumni.psu.edu>
GetUserName should include the terminating null character when
returning the size of the buffer returned.
Correctly handle the ERROR_MORE_DATA case.

Index: dlls/advapi32/advapi.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/advapi.c,v
retrieving revision 1.13
diff -u -r1.13 advapi.c
--- dlls/advapi32/advapi.c	2001/02/14 23:11:17	1.13
+++ dlls/advapi32/advapi.c	2001/11/18 16:35:21
@@ -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 @@
   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;
 }




More information about the wine-patches mailing list