From d7e9dab03d4791de2c2e31e401e51941fd68f294 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Sun, 18 Mar 2012 00:26:28 +0100 Subject: [PATCH] q3map2: getpwent() result may not be persistent Use getpwuid_r() instead and store the path in a static buffer. --- tools/quake3/q3map2/path_init.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/tools/quake3/q3map2/path_init.c b/tools/quake3/q3map2/path_init.c index 6bd0613..ac8fa32 100644 --- a/tools/quake3/q3map2/path_init.c +++ b/tools/quake3/q3map2/path_init.c @@ -66,29 +66,23 @@ char *LokiGetHomeDir( void ){ #ifndef Q_UNIX return NULL; #else + static char buf[ 4096 ]; + struct passwd pw, *pwp; char *home; - uid_t id; - struct passwd *pwd; /* get the home environment variable */ home = getenv( "HOME" ); - if ( home == NULL ) { - /* do some more digging */ - id = getuid(); - setpwent(); - while ( ( pwd = getpwent() ) != NULL ) - { - if ( pwd->pw_uid == id ) { - home = pwd->pw_dir; - break; - } - } - endpwent(); + if ( home ) { + return Q_strncpyz( buf, home, sizeof( buf ) ); } - /* return it */ - return home; + /* look up home dir in password database */ + if ( getpwuid_r( getuid(), &pw, buf, sizeof( buf ), &pwp ) == 0 ) { + return pw.pw_dir; + } + + return NULL; #endif }