From: Ben Noordhuis Date: Sat, 17 Mar 2012 23:26:28 +0000 (+0100) Subject: q3map2: getpwent() result may not be persistent X-Git-Tag: xonotic-v0.7.0~16^2~6^2~2^2^2~4 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=commitdiff_plain;h=d7e9dab03d4791de2c2e31e401e51941fd68f294 q3map2: getpwent() result may not be persistent Use getpwuid_r() instead and store the path in a static buffer. --- diff --git a/tools/quake3/q3map2/path_init.c b/tools/quake3/q3map2/path_init.c index 6bd06135..ac8fa328 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 }