diff options
author | Dan Fandrich <dan@coneharvesters.com> | 2014-07-13 00:18:40 +0200 |
---|---|---|
committer | Dan Fandrich <dan@coneharvesters.com> | 2014-07-13 00:27:22 +0200 |
commit | 763c51780c0830983ee75d66d516d65911b0e96a (patch) | |
tree | 8f1ec411866fae65e17631adca3f9f87dbc0caac /lib/netrc.c | |
parent | 6c6ba59e6bc7c84d9d0f83273055a7448a0eea27 (diff) | |
download | curl-763c51780c0830983ee75d66d516d65911b0e96a.tar.gz |
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
Diffstat (limited to 'lib/netrc.c')
-rw-r--r-- | lib/netrc.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/netrc.c b/lib/netrc.c index a7a710159..7435d94c4 100644 --- a/lib/netrc.c +++ b/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; |