Skip to content

Commit

Permalink
netrc: fixed thread safety problem by using getpwuid_r if available
Browse files Browse the repository at this point in the history
The old way using getpwuid could cause problems in programs that enable
reading from netrc files simultaneously in multiple threads.

Reported-by: David Woodhouse
  • Loading branch information
dfandrich committed Jul 12, 2014
1 parent 6c6ba59 commit 763c517
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
1 change: 1 addition & 0 deletions RELEASE-NOTES
Expand Up @@ -58,6 +58,7 @@ This release includes the following bugfixes:
o build: Fixed overridden compiler PDB settings in VC7 to VC12
o ntlm_wb: Fixed buffer size not being large enough for NTLMv2 sessions [11]
o netrc: don't abort if home dir cannot be found
o netrc: fixed thread safety problem by using getpwuid_r if available

This release includes the following known bugs:

Expand Down
1 change: 1 addition & 0 deletions configure.ac
Expand Up @@ -3033,6 +3033,7 @@ AC_CHECK_FUNCS([fork \
getppid \
getprotobyname \
getpwuid \
getpwuid_r \
getrlimit \
gettimeofday \
if_nametoindex \
Expand Down
14 changes: 13 additions & 1 deletion lib/netrc.c
Expand Up @@ -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;
Expand Down

0 comments on commit 763c517

Please sign in to comment.