1
0
mirror of https://github.com/moparisthebest/curl synced 2024-08-13 17:03:50 -04:00

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:
Dan Fandrich 2014-07-13 00:18:40 +02:00
parent 6c6ba59e6b
commit 763c51780c
3 changed files with 15 additions and 1 deletions

View File

@ -58,6 +58,7 @@ This release includes the following bugfixes:
o build: Fixed overridden compiler PDB settings in VC7 to VC12 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 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: 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: This release includes the following known bugs:

View File

@ -3033,6 +3033,7 @@ AC_CHECK_FUNCS([fork \
getppid \ getppid \
getprotobyname \ getprotobyname \
getpwuid \ getpwuid \
getpwuid_r \
getrlimit \ getrlimit \
gettimeofday \ gettimeofday \
if_nametoindex \ if_nametoindex \

View File

@ -76,7 +76,19 @@ int Curl_parsenetrc(const char *host,
char *home = curl_getenv("HOME"); /* portable environment reader */ char *home = curl_getenv("HOME"); /* portable environment reader */
if(home) { if(home) {
home_alloc = TRUE; 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 { else {
struct passwd *pw; struct passwd *pw;