James Juran <jamesjuran@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; }