mirror of
https://github.com/moparisthebest/curl
synced 2024-11-15 14:05:03 -05:00
netrc: free temporary strings if memory allocation fails
- Change the inout parameters after all needed memory has been allocated. Do not change them if something goes wrong. - Free the allocated temporary strings if strdup() fails. Closes #3122
This commit is contained in:
parent
4f2541f975
commit
d48e6b7f95
48
lib/netrc.c
48
lib/netrc.c
@ -57,7 +57,11 @@ int Curl_parsenetrc(const char *host,
|
|||||||
{
|
{
|
||||||
FILE *file;
|
FILE *file;
|
||||||
int retcode = 1;
|
int retcode = 1;
|
||||||
int specific_login = (*loginp && **loginp != 0);
|
char *login = *loginp;
|
||||||
|
char *password = *passwordp;
|
||||||
|
bool specific_login = (login && *login != 0);
|
||||||
|
bool login_alloc = FALSE;
|
||||||
|
bool password_alloc = FALSE;
|
||||||
bool netrc_alloc = FALSE;
|
bool netrc_alloc = FALSE;
|
||||||
enum host_lookup_state state = NOTHING;
|
enum host_lookup_state state = NOTHING;
|
||||||
|
|
||||||
@ -125,7 +129,7 @@ int Curl_parsenetrc(const char *host,
|
|||||||
continue;
|
continue;
|
||||||
while(!done && tok) {
|
while(!done && tok) {
|
||||||
|
|
||||||
if((*loginp && **loginp) && (*passwordp && **passwordp)) {
|
if((login && *login) && (password && *password)) {
|
||||||
done = TRUE;
|
done = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -158,26 +162,34 @@ int Curl_parsenetrc(const char *host,
|
|||||||
/* we are now parsing sub-keywords concerning "our" host */
|
/* we are now parsing sub-keywords concerning "our" host */
|
||||||
if(state_login) {
|
if(state_login) {
|
||||||
if(specific_login) {
|
if(specific_login) {
|
||||||
state_our_login = strcasecompare(*loginp, tok);
|
state_our_login = strcasecompare(login, tok);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
free(*loginp);
|
if(login_alloc) {
|
||||||
*loginp = strdup(tok);
|
free(login);
|
||||||
if(!*loginp) {
|
login_alloc = FALSE;
|
||||||
|
}
|
||||||
|
login = strdup(tok);
|
||||||
|
if(!login) {
|
||||||
retcode = -1; /* allocation failed */
|
retcode = -1; /* allocation failed */
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
login_alloc = TRUE;
|
||||||
}
|
}
|
||||||
state_login = 0;
|
state_login = 0;
|
||||||
}
|
}
|
||||||
else if(state_password) {
|
else if(state_password) {
|
||||||
if(state_our_login || !specific_login) {
|
if(state_our_login || !specific_login) {
|
||||||
free(*passwordp);
|
if(password_alloc) {
|
||||||
*passwordp = strdup(tok);
|
free(password);
|
||||||
if(!*passwordp) {
|
password_alloc = FALSE;
|
||||||
|
}
|
||||||
|
password = strdup(tok);
|
||||||
|
if(!password) {
|
||||||
retcode = -1; /* allocation failed */
|
retcode = -1; /* allocation failed */
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
password_alloc = TRUE;
|
||||||
}
|
}
|
||||||
state_password = 0;
|
state_password = 0;
|
||||||
}
|
}
|
||||||
@ -198,6 +210,24 @@ int Curl_parsenetrc(const char *host,
|
|||||||
} /* while fgets() */
|
} /* while fgets() */
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
if(!retcode) {
|
||||||
|
if(login_alloc) {
|
||||||
|
if(*loginp)
|
||||||
|
free(*loginp);
|
||||||
|
*loginp = login;
|
||||||
|
}
|
||||||
|
if(password_alloc) {
|
||||||
|
if(*passwordp)
|
||||||
|
free(*passwordp);
|
||||||
|
*passwordp = password;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(login_alloc)
|
||||||
|
free(login);
|
||||||
|
if(password_alloc)
|
||||||
|
free(password);
|
||||||
|
}
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user