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:
parent
6c6ba59e6b
commit
763c51780c
@ -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:
|
||||||
|
|
||||||
|
@ -3033,6 +3033,7 @@ AC_CHECK_FUNCS([fork \
|
|||||||
getppid \
|
getppid \
|
||||||
getprotobyname \
|
getprotobyname \
|
||||||
getpwuid \
|
getpwuid \
|
||||||
|
getpwuid_r \
|
||||||
getrlimit \
|
getrlimit \
|
||||||
gettimeofday \
|
gettimeofday \
|
||||||
if_nametoindex \
|
if_nametoindex \
|
||||||
|
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 */
|
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user