netrc: fixed thread safety problem by using getpwuid_r if available
The old way using getpwuid could cause problems in programs that enable reading from netrc files simultaneously in multiple threads. Reported-by: David Woodhouse
This commit is contained in:
14
lib/netrc.c
14
lib/netrc.c
@@ -76,7 +76,19 @@ int Curl_parsenetrc(const char *host,
|
||||
char *home = curl_getenv("HOME"); /* portable environment reader */
|
||||
if(home) {
|
||||
home_alloc = TRUE;
|
||||
#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
|
||||
#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID)
|
||||
}
|
||||
else {
|
||||
struct passwd pw, *pw_res;
|
||||
char pwbuf[1024];
|
||||
if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res)
|
||||
&& pw_res) {
|
||||
home = strdup(pw.pw_dir);
|
||||
if(!home)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
home_alloc = TRUE;
|
||||
}
|
||||
#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
|
||||
}
|
||||
else {
|
||||
struct passwd *pw;
|
||||
|
||||
Reference in New Issue
Block a user