curl-library
[PATCH curl 6/7] url: handle exceptional cases first in parse_url_login()
From: Jonathan Nieder <jrnieder_at_gmail.com>
Date: Tue, 20 Aug 2013 00:52:00 -0700
Date: Tue, 20 Aug 2013 00:52:00 -0700
Instead of nesting "if(success)" blocks and leaving the reader in
suspense about what happens in the !success case, deal with failure
cases early, usually with a simple goto to clean up and return from
the function.
No functional change intended. The main effect is to decrease the
indentation of this function slightly.
--- Unchanged. lib/url.c | 145 ++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 71 insertions(+), 74 deletions(-) diff --git a/lib/url.c b/lib/url.c index 73bee68b..5f21b4c2 100644 --- a/lib/url.c +++ b/lib/url.c @@ -4460,86 +4460,83 @@ static CURLcode parse_url_login(struct SessionHandle *data, passwd[0] = 0; options[0] = 0; + if(!ptr) + goto out; + /* We will now try to extract the * possible login information in a string like: * ftp://user:password@ftp.my.site:8021/README */ - if(ptr) { - /* There's login information to the left of the @ */ - - conn->host.name = ++ptr; - - /* So the hostname is sane. Only bother interpreting the - * results if we could care. It could still be wasted - * work because it might be overtaken by the programmatically - * set user/passwd, but doing that first adds more cases here :-( - */ - - if(data->set.use_netrc != CURL_NETRC_REQUIRED) { - /* We could use the login information in the URL so extract it */ - result = parse_login_details(login, ptr - login - 1, - &userp, &passwdp, &optionsp); - if(!result) { - if(userp) { - char *newname; - - /* We have a user in the URL */ - conn->bits.userpwd_in_url = TRUE; - conn->bits.user_passwd = TRUE; /* enable user+password */ - - /* Decode the user */ - newname = curl_easy_unescape(data, userp, 0, NULL); - if(!newname) { - Curl_safefree(userp); - Curl_safefree(passwdp); - Curl_safefree(optionsp); - return CURLE_OUT_OF_MEMORY; - } - - if(strlen(newname) < MAX_CURL_USER_LENGTH) - strcpy(user, newname); - - free(newname); - } - - if(passwdp) { - /* We have a password in the URL so decode it */ - char *newpasswd = curl_easy_unescape(data, passwdp, 0, NULL); - if(!newpasswd) { - Curl_safefree(userp); - Curl_safefree(passwdp); - Curl_safefree(optionsp); - return CURLE_OUT_OF_MEMORY; - } - - if(strlen(newpasswd) < MAX_CURL_PASSWORD_LENGTH) - strcpy(passwd, newpasswd); - - free(newpasswd); - } - - if(optionsp) { - /* We have an options list in the URL so decode it */ - char *newoptions = curl_easy_unescape(data, optionsp, 0, NULL); - if(!newoptions) { - Curl_safefree(userp); - Curl_safefree(passwdp); - Curl_safefree(optionsp); - return CURLE_OUT_OF_MEMORY; - } - - if(strlen(newoptions) < MAX_CURL_OPTIONS_LENGTH) - strcpy(options, newoptions); - - free(newoptions); - } - } - - Curl_safefree(userp); - Curl_safefree(passwdp); - Curl_safefree(optionsp); + conn->host.name = ++ptr; + + /* So the hostname is sane. Only bother interpreting the + * results if we could care. It could still be wasted + * work because it might be overtaken by the programmatically + * set user/passwd, but doing that first adds more cases here :-( + */ + + if(data->set.use_netrc == CURL_NETRC_REQUIRED) + goto out; + + /* We could use the login information in the URL so extract it */ + result = parse_login_details(login, ptr - login - 1, + &userp, &passwdp, &optionsp); + if(result != CURLE_OK) + goto out; + + if(userp) { + char *newname; + + /* We have a user in the URL */ + conn->bits.userpwd_in_url = TRUE; + conn->bits.user_passwd = TRUE; /* enable user+password */ + + /* Decode the user */ + newname = curl_easy_unescape(data, userp, 0, NULL); + if(!newname) { + result = CURLE_OUT_OF_MEMORY; + goto out; + } + + if(strlen(newname) < MAX_CURL_USER_LENGTH) + strcpy(user, newname); + + free(newname); + } + + if(passwdp) { + /* We have a password in the URL so decode it */ + char *newpasswd = curl_easy_unescape(data, passwdp, 0, NULL); + if(!newpasswd) { + result = CURLE_OUT_OF_MEMORY; + goto out; + } + + if(strlen(newpasswd) < MAX_CURL_PASSWORD_LENGTH) + strcpy(passwd, newpasswd); + + free(newpasswd); + } + + if(optionsp) { + /* We have an options list in the URL so decode it */ + char *newoptions = curl_easy_unescape(data, optionsp, 0, NULL); + if(!newoptions) { + result = CURLE_OUT_OF_MEMORY; + goto out; } + + if(strlen(newoptions) < MAX_CURL_OPTIONS_LENGTH) + strcpy(options, newoptions); + + free(newoptions); } + out: + + Curl_safefree(userp); + Curl_safefree(passwdp); + Curl_safefree(optionsp); + return result; } -- 1.8.4.rc4 ------------------------------------------------------------------- List admin: http://cool.haxx.se/list/listinfo/curl-library Etiquette: http://curl.haxx.se/mail/etiquette.htmlReceived on 2013-08-20