diff options
author | Michael Kaufmann <mail@michael-kaufmann.ch> | 2018-11-03 16:58:18 +0100 |
---|---|---|
committer | Michael Kaufmann <mail@michael-kaufmann.ch> | 2018-11-05 20:34:01 +0100 |
commit | 53db15ba5524584196eedb3abe8d2e97fb5a3cc0 (patch) | |
tree | 9e249e6b15f8e4580dd837cd15a6c678e2d6d057 /lib/netrc.c | |
parent | a77b640cc0ddace57758946881294db6f03db16e (diff) | |
download | curl-53db15ba5524584196eedb3abe8d2e97fb5a3cc0.tar.gz |
netrc: don't ignore the login name specified with "--user"
- for "--netrc", don't ignore the login/password specified with "--user",
only ignore the login/password in the URL.
This restores the netrc behaviour of curl 7.61.1 and earlier.
- fix the documentation of CURL_NETRC_REQUIRED
- improve the detection of login/password changes when reading .netrc
- don't read .netrc if both login and password are already set
Fixes #3213
Closes #3224
Diffstat (limited to 'lib/netrc.c')
-rw-r--r-- | lib/netrc.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/netrc.c b/lib/netrc.c index 1724b35b0..aba355b76 100644 --- a/lib/netrc.c +++ b/lib/netrc.c @@ -53,6 +53,8 @@ enum host_lookup_state { int Curl_parsenetrc(const char *host, char **loginp, char **passwordp, + bool *login_changed, + bool *password_changed, char *netrcfile) { FILE *file; @@ -164,7 +166,7 @@ int Curl_parsenetrc(const char *host, if(specific_login) { state_our_login = strcasecompare(login, tok); } - else { + else if(!login || strcmp(login, tok)) { if(login_alloc) { free(login); login_alloc = FALSE; @@ -179,7 +181,8 @@ int Curl_parsenetrc(const char *host, state_login = 0; } else if(state_password) { - if(state_our_login || !specific_login) { + if((state_our_login || !specific_login) + && (!password || strcmp(password, tok))) { if(password_alloc) { free(password); password_alloc = FALSE; @@ -211,15 +214,19 @@ int Curl_parsenetrc(const char *host, out: if(!retcode) { + *login_changed = FALSE; + *password_changed = FALSE; if(login_alloc) { if(*loginp) free(*loginp); *loginp = login; + *login_changed = TRUE; } if(password_alloc) { if(*passwordp) free(*passwordp); *passwordp = password; + *password_changed = TRUE; } } else { |