You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2990 lines
100 KiB
2990 lines
100 KiB
6 years ago
|
From 965f26c806a87fbf9ae803d12d57b1e5f91e0754 Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sat, 13 Apr 2013 10:49:42 +0100
|
||
|
Subject: [PATCH 01/28] url: Added support for parsing login options from the
|
||
|
URL
|
||
|
|
||
|
As well as parsing the username and password from the URL, added support
|
||
|
for parsing the optional options part from the login details, to allow
|
||
|
the following supported URL format:
|
||
|
|
||
|
schema://username:password;options@example.com/path?q=foobar
|
||
|
|
||
|
This will only be used by IMAP, POP3 and SMTP at present but any
|
||
|
protocol that may be given login options in the URL will be able to
|
||
|
add support for them.
|
||
|
|
||
|
Upstream-commit: 73aa95592f47d461f0246eef1187f5d569aa6afa
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 79 ++++++++++++++++++++++++++++++++++++++++++++---------------
|
||
|
lib/urldata.h | 3 +++
|
||
|
2 files changed, 62 insertions(+), 20 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 2dc56ae..fdf6bca 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -2461,6 +2461,7 @@ static void conn_free(struct connectdata *conn)
|
||
|
|
||
|
Curl_safefree(conn->user);
|
||
|
Curl_safefree(conn->passwd);
|
||
|
+ Curl_safefree(conn->options);
|
||
|
Curl_safefree(conn->proxyuser);
|
||
|
Curl_safefree(conn->proxypasswd);
|
||
|
Curl_safefree(conn->allocptr.proxyuserpwd);
|
||
|
@@ -4283,24 +4284,27 @@ static CURLcode parse_url_userpass(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
char *user, char *passwd)
|
||
|
{
|
||
|
+ char options[MAX_CURL_OPTIONS_LENGTH];
|
||
|
+
|
||
|
/* At this point, we're hoping all the other special cases have
|
||
|
* been taken care of, so conn->host.name is at most
|
||
|
- * [user[:password]]@]hostname
|
||
|
+ * [user[:password][;options]]@]hostname
|
||
|
*
|
||
|
* We need somewhere to put the embedded details, so do that first.
|
||
|
*/
|
||
|
|
||
|
- char *ptr=strchr(conn->host.name, '@');
|
||
|
+ char *ptr = strchr(conn->host.name, '@');
|
||
|
char *userpass = conn->host.name;
|
||
|
|
||
|
- user[0] =0; /* to make everything well-defined */
|
||
|
- passwd[0]=0;
|
||
|
+ user[0] = 0; /* to make everything well-defined */
|
||
|
+ passwd[0] = 0;
|
||
|
+ options[0] = 0;
|
||
|
|
||
|
/* We will now try to extract the
|
||
|
- * possible user+password pair in a string like:
|
||
|
+ * possible login information in a string like:
|
||
|
* ftp://user:password@ftp.my.site:8021/README */
|
||
|
if(ptr != NULL) {
|
||
|
- /* there's a user+password given here, to the left of the @ */
|
||
|
+ /* There's login information to the left of the @ */
|
||
|
|
||
|
conn->host.name = ++ptr;
|
||
|
|
||
|
@@ -4310,26 +4314,46 @@ static CURLcode parse_url_userpass(struct SessionHandle *data,
|
||
|
* set user/passwd, but doing that first adds more cases here :-(
|
||
|
*/
|
||
|
|
||
|
- conn->bits.userpwd_in_url = TRUE;
|
||
|
if(data->set.use_netrc != CURL_NETRC_REQUIRED) {
|
||
|
- /* We could use the one in the URL */
|
||
|
-
|
||
|
- conn->bits.user_passwd = TRUE; /* enable user+password */
|
||
|
-
|
||
|
+ /* We could use the information in the URL so extract it */
|
||
|
if(*userpass != ':') {
|
||
|
- /* the name is given, get user+password */
|
||
|
- sscanf(userpass, "%" MAX_CURL_USER_LENGTH_TXT "[^:@]:"
|
||
|
- "%" MAX_CURL_PASSWORD_LENGTH_TXT "[^@]",
|
||
|
- user, passwd);
|
||
|
+ if(*userpass != ';') {
|
||
|
+ /* The user is given so extract the user, password and options */
|
||
|
+ int result = sscanf(userpass,
|
||
|
+ "%" MAX_CURL_USER_LENGTH_TXT "[^:;@]:"
|
||
|
+ "%" MAX_CURL_PASSWORD_LENGTH_TXT "[^;@];"
|
||
|
+ "%" MAX_CURL_OPTIONS_LENGTH_TXT "[^@]",
|
||
|
+ user, passwd, options);
|
||
|
+
|
||
|
+ /* The extract failed so extract the user and options instead */
|
||
|
+ if(result == 1)
|
||
|
+ sscanf(userpass, "%" MAX_CURL_USER_LENGTH_TXT "[^:;@];"
|
||
|
+ "%" MAX_CURL_OPTIONS_LENGTH_TXT "[^@]",
|
||
|
+ user, options);
|
||
|
+ }
|
||
|
+ else {
|
||
|
+ /* No name or password are given so extract the options only */
|
||
|
+ sscanf(userpass, ";%" MAX_CURL_OPTIONS_LENGTH_TXT "[^@]", options);
|
||
|
+ }
|
||
|
}
|
||
|
else
|
||
|
- /* no name given, get the password only */
|
||
|
- sscanf(userpass, ":%" MAX_CURL_PASSWORD_LENGTH_TXT "[^@]", passwd);
|
||
|
+ /* No name is given so extract the password and options */
|
||
|
+ sscanf(userpass, ":%" MAX_CURL_PASSWORD_LENGTH_TXT "[^;@];"
|
||
|
+ "%" MAX_CURL_OPTIONS_LENGTH_TXT "[^@]",
|
||
|
+ passwd, options);
|
||
|
|
||
|
if(user[0]) {
|
||
|
- char *newname=curl_easy_unescape(data, user, 0, NULL);
|
||
|
+ 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, user, 0, NULL);
|
||
|
if(!newname)
|
||
|
return CURLE_OUT_OF_MEMORY;
|
||
|
+
|
||
|
if(strlen(newname) < MAX_CURL_USER_LENGTH)
|
||
|
strcpy(user, newname);
|
||
|
|
||
|
@@ -4337,18 +4361,33 @@ static CURLcode parse_url_userpass(struct SessionHandle *data,
|
||
|
the unconverted name, it'll be wrong but what the heck */
|
||
|
free(newname);
|
||
|
}
|
||
|
+
|
||
|
if(passwd[0]) {
|
||
|
- /* we have a password found in the URL, decode it! */
|
||
|
- char *newpasswd=curl_easy_unescape(data, passwd, 0, NULL);
|
||
|
+ /* We have a password in the URL so decode it */
|
||
|
+ char *newpasswd = curl_easy_unescape(data, passwd, 0, NULL);
|
||
|
if(!newpasswd)
|
||
|
return CURLE_OUT_OF_MEMORY;
|
||
|
+
|
||
|
if(strlen(newpasswd) < MAX_CURL_PASSWORD_LENGTH)
|
||
|
strcpy(passwd, newpasswd);
|
||
|
|
||
|
free(newpasswd);
|
||
|
}
|
||
|
+
|
||
|
+ if(options[0]) {
|
||
|
+ /* We have an options list in the URL so decode it */
|
||
|
+ char *newoptions = curl_easy_unescape(data, options, 0, NULL);
|
||
|
+ if(!newoptions)
|
||
|
+ return CURLE_OUT_OF_MEMORY;
|
||
|
+
|
||
|
+ if(strlen(newoptions) < MAX_CURL_OPTIONS_LENGTH)
|
||
|
+ conn->options = newoptions;
|
||
|
+ else
|
||
|
+ free(newoptions);
|
||
|
+ }
|
||
|
}
|
||
|
}
|
||
|
+
|
||
|
return CURLE_OK;
|
||
|
}
|
||
|
|
||
|
diff --git a/lib/urldata.h b/lib/urldata.h
|
||
|
index 26bc89f..46ef5d5 100644
|
||
|
--- a/lib/urldata.h
|
||
|
+++ b/lib/urldata.h
|
||
|
@@ -847,6 +847,7 @@ struct connectdata {
|
||
|
|
||
|
char *user; /* user name string, allocated */
|
||
|
char *passwd; /* password string, allocated */
|
||
|
+ char *options; /* options string, allocated */
|
||
|
|
||
|
char *proxyuser; /* proxy user name string, allocated */
|
||
|
char *proxypasswd; /* proxy password string, allocated */
|
||
|
@@ -1132,8 +1133,10 @@ typedef enum {
|
||
|
* Session-data MUST be put in the connectdata struct and here. */
|
||
|
#define MAX_CURL_USER_LENGTH 256
|
||
|
#define MAX_CURL_PASSWORD_LENGTH 256
|
||
|
+#define MAX_CURL_OPTIONS_LENGTH 256
|
||
|
#define MAX_CURL_USER_LENGTH_TXT "255"
|
||
|
#define MAX_CURL_PASSWORD_LENGTH_TXT "255"
|
||
|
+#define MAX_CURL_OPTIONS_LENGTH_TXT "255"
|
||
|
|
||
|
struct auth {
|
||
|
unsigned long want; /* Bitmask set to the authentication methods wanted by
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 8e092594b858dd049e3f4f6660325f703e0a1c44 Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Thu, 18 Apr 2013 17:02:28 +0100
|
||
|
Subject: [PATCH 02/28] url: Reworked URL parsing to allow overriding by
|
||
|
CURLOPT_USERPWD
|
||
|
|
||
|
Upstream-commit: 90c87f311eb087840008bfe89b19e6e0b808a246
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 50 +++++++++++++++++++++++++++++++-------------------
|
||
|
1 file changed, 31 insertions(+), 19 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index fdf6bca..4a9df84 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -140,7 +140,7 @@ static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke);
|
||
|
static CURLcode do_init(struct connectdata *conn);
|
||
|
static CURLcode parse_url_userpass(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
- char *user, char *passwd);
|
||
|
+ char *user, char *passwd, char *options);
|
||
|
/*
|
||
|
* Protocol table.
|
||
|
*/
|
||
|
@@ -3585,8 +3585,7 @@ static CURLcode findprotocol(struct SessionHandle *data,
|
||
|
static CURLcode parseurlandfillconn(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
bool *prot_missing,
|
||
|
- char *user,
|
||
|
- char *passwd)
|
||
|
+ char *user, char *passwd, char *options)
|
||
|
{
|
||
|
char *at;
|
||
|
char *fragment;
|
||
|
@@ -3811,7 +3810,7 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
|
||
|
* Parse a user name and password in the URL and strip it out
|
||
|
* of the host name
|
||
|
*************************************************************/
|
||
|
- result = parse_url_userpass(data, conn, user, passwd);
|
||
|
+ result = parse_url_userpass(data, conn, user, passwd, options);
|
||
|
if(result != CURLE_OK)
|
||
|
return result;
|
||
|
|
||
|
@@ -4282,10 +4281,8 @@ static CURLcode parse_proxy_auth(struct SessionHandle *data,
|
||
|
*/
|
||
|
static CURLcode parse_url_userpass(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
- char *user, char *passwd)
|
||
|
+ char *user, char *passwd, char *options)
|
||
|
{
|
||
|
- char options[MAX_CURL_OPTIONS_LENGTH];
|
||
|
-
|
||
|
/* At this point, we're hoping all the other special cases have
|
||
|
* been taken care of, so conn->host.name is at most
|
||
|
* [user[:password][;options]]@]hostname
|
||
|
@@ -4381,9 +4378,9 @@ static CURLcode parse_url_userpass(struct SessionHandle *data,
|
||
|
return CURLE_OUT_OF_MEMORY;
|
||
|
|
||
|
if(strlen(newoptions) < MAX_CURL_OPTIONS_LENGTH)
|
||
|
- conn->options = newoptions;
|
||
|
- else
|
||
|
- free(newoptions);
|
||
|
+ strcpy(options, newoptions);
|
||
|
+
|
||
|
+ free(newoptions);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
@@ -4551,11 +4548,13 @@ static void override_userpass(struct SessionHandle *data,
|
||
|
* Set password so it's available in the connection.
|
||
|
*/
|
||
|
static CURLcode set_userpass(struct connectdata *conn,
|
||
|
- const char *user, const char *passwd)
|
||
|
+ const char *user, const char *passwd,
|
||
|
+ const char *options)
|
||
|
{
|
||
|
+ CURLcode result = CURLE_OK;
|
||
|
+
|
||
|
/* If our protocol needs a password and we have none, use the defaults */
|
||
|
- if((conn->handler->flags & PROTOPT_NEEDSPWD) &&
|
||
|
- !conn->bits.user_passwd) {
|
||
|
+ if((conn->handler->flags & PROTOPT_NEEDSPWD) && !conn->bits.user_passwd) {
|
||
|
|
||
|
conn->user = strdup(CURL_DEFAULT_USER);
|
||
|
if(conn->user)
|
||
|
@@ -4565,17 +4564,28 @@ static CURLcode set_userpass(struct connectdata *conn,
|
||
|
/* This is the default password, so DON'T set conn->bits.user_passwd */
|
||
|
}
|
||
|
else {
|
||
|
- /* store user + password, zero-length if not set */
|
||
|
+ /* Store the user, zero-length if not set */
|
||
|
conn->user = strdup(user);
|
||
|
+
|
||
|
+ /* Store the password (only if user is present), zero-length if not set */
|
||
|
if(conn->user)
|
||
|
conn->passwd = strdup(passwd);
|
||
|
else
|
||
|
conn->passwd = NULL;
|
||
|
}
|
||
|
+
|
||
|
if(!conn->user || !conn->passwd)
|
||
|
- return CURLE_OUT_OF_MEMORY;
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
|
||
|
- return CURLE_OK;
|
||
|
+ /* Store the options, null if not set */
|
||
|
+ if(!result && options[0]) {
|
||
|
+ conn->options = strdup(options);
|
||
|
+
|
||
|
+ if(!conn->options)
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ }
|
||
|
+
|
||
|
+ return result;
|
||
|
}
|
||
|
|
||
|
/*************************************************************
|
||
|
@@ -4745,12 +4755,13 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
struct connectdata **in_connect,
|
||
|
bool *async)
|
||
|
{
|
||
|
- CURLcode result=CURLE_OK;
|
||
|
+ CURLcode result = CURLE_OK;
|
||
|
struct connectdata *conn;
|
||
|
struct connectdata *conn_temp = NULL;
|
||
|
size_t urllen;
|
||
|
char user[MAX_CURL_USER_LENGTH];
|
||
|
char passwd[MAX_CURL_PASSWORD_LENGTH];
|
||
|
+ char options[MAX_CURL_OPTIONS_LENGTH];
|
||
|
bool reuse;
|
||
|
char *proxy = NULL;
|
||
|
bool prot_missing = FALSE;
|
||
|
@@ -4815,7 +4826,8 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
conn->host.name = conn->host.rawalloc;
|
||
|
conn->host.name[0] = 0;
|
||
|
|
||
|
- result = parseurlandfillconn(data, conn, &prot_missing, user, passwd);
|
||
|
+ result = parseurlandfillconn(data, conn, &prot_missing, user, passwd,
|
||
|
+ options);
|
||
|
if(result != CURLE_OK)
|
||
|
return result;
|
||
|
|
||
|
@@ -5016,7 +5028,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
* for use
|
||
|
*************************************************************/
|
||
|
override_userpass(data, conn, user, passwd);
|
||
|
- result = set_userpass(conn, user, passwd);
|
||
|
+ result = set_userpass(conn, user, passwd, options);
|
||
|
if(result != CURLE_OK)
|
||
|
return result;
|
||
|
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From c9099e450c8eebbc3318f827a8532448f6a8631f Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Thu, 18 Apr 2013 17:09:40 +0100
|
||
|
Subject: [PATCH 03/28] url: Re-factored set_userpass() and
|
||
|
parse_url_userpass()
|
||
|
|
||
|
Re-factored these functions to reflect their new behaviour following the
|
||
|
addition of login options.
|
||
|
|
||
|
Upstream-commit: 0d49e408a48246b9a27448473e78ce3fd237b19e
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 41 +++++++++++++++++++++++------------------
|
||
|
1 file changed, 23 insertions(+), 18 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 4a9df84..f03ca0f 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -138,9 +138,9 @@ find_oldest_idle_connection(struct SessionHandle *data);
|
||
|
static void conn_free(struct connectdata *conn);
|
||
|
static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke);
|
||
|
static CURLcode do_init(struct connectdata *conn);
|
||
|
-static CURLcode parse_url_userpass(struct SessionHandle *data,
|
||
|
- struct connectdata *conn,
|
||
|
- char *user, char *passwd, char *options);
|
||
|
+static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
+ struct connectdata *conn,
|
||
|
+ char *user, char *passwd, char *options);
|
||
|
/*
|
||
|
* Protocol table.
|
||
|
*/
|
||
|
@@ -3806,11 +3806,11 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
|
||
|
data->change.url_alloc = TRUE; /* free this later */
|
||
|
}
|
||
|
|
||
|
- /*************************************************************
|
||
|
- * Parse a user name and password in the URL and strip it out
|
||
|
- * of the host name
|
||
|
- *************************************************************/
|
||
|
- result = parse_url_userpass(data, conn, user, passwd, options);
|
||
|
+ /*
|
||
|
+ * Parse the login details from the URL and strip them out of
|
||
|
+ * the host name
|
||
|
+ */
|
||
|
+ result = parse_url_login(data, conn, user, passwd, options);
|
||
|
if(result != CURLE_OK)
|
||
|
return result;
|
||
|
|
||
|
@@ -4268,7 +4268,8 @@ static CURLcode parse_proxy_auth(struct SessionHandle *data,
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
- * Parse a user name and password in the URL and strip it out of the host name
|
||
|
+ * Parse the login details (user name, password and options) from the URL and
|
||
|
+ * strip them out of the host name
|
||
|
*
|
||
|
* Inputs: data->set.use_netrc (CURLOPT_NETRC)
|
||
|
* conn->host.name
|
||
|
@@ -4276,12 +4277,13 @@ static CURLcode parse_proxy_auth(struct SessionHandle *data,
|
||
|
* Outputs: (almost :- all currently undefined)
|
||
|
* conn->bits.user_passwd - non-zero if non-default passwords exist
|
||
|
* user - non-zero length if defined
|
||
|
- * passwd - ditto
|
||
|
+ * passwd - non-zero length if defined
|
||
|
+ * options - non-zero length if defined
|
||
|
* conn->host.name - remove user name and password
|
||
|
*/
|
||
|
-static CURLcode parse_url_userpass(struct SessionHandle *data,
|
||
|
- struct connectdata *conn,
|
||
|
- char *user, char *passwd, char *options)
|
||
|
+static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
+ struct connectdata *conn,
|
||
|
+ char *user, char *passwd, char *options)
|
||
|
{
|
||
|
/* At this point, we're hoping all the other special cases have
|
||
|
* been taken care of, so conn->host.name is at most
|
||
|
@@ -4547,20 +4549,23 @@ static void override_userpass(struct SessionHandle *data,
|
||
|
/*
|
||
|
* Set password so it's available in the connection.
|
||
|
*/
|
||
|
-static CURLcode set_userpass(struct connectdata *conn,
|
||
|
- const char *user, const char *passwd,
|
||
|
- const char *options)
|
||
|
+static CURLcode set_login(struct connectdata *conn,
|
||
|
+ const char *user, const char *passwd,
|
||
|
+ const char *options)
|
||
|
{
|
||
|
CURLcode result = CURLE_OK;
|
||
|
|
||
|
/* If our protocol needs a password and we have none, use the defaults */
|
||
|
if((conn->handler->flags & PROTOPT_NEEDSPWD) && !conn->bits.user_passwd) {
|
||
|
-
|
||
|
+ /* Store the default user */
|
||
|
conn->user = strdup(CURL_DEFAULT_USER);
|
||
|
+
|
||
|
+ /* Store the default password */
|
||
|
if(conn->user)
|
||
|
conn->passwd = strdup(CURL_DEFAULT_PASSWORD);
|
||
|
else
|
||
|
conn->passwd = NULL;
|
||
|
+
|
||
|
/* This is the default password, so DON'T set conn->bits.user_passwd */
|
||
|
}
|
||
|
else {
|
||
|
@@ -5028,7 +5033,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
* for use
|
||
|
*************************************************************/
|
||
|
override_userpass(data, conn, user, passwd);
|
||
|
- result = set_userpass(conn, user, passwd, options);
|
||
|
+ result = set_login(conn, user, passwd, options);
|
||
|
if(result != CURLE_OK)
|
||
|
return result;
|
||
|
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From a66a0feefcb037ffcfaf2dbd3dcd9f17a416ad13 Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Thu, 18 Apr 2013 17:52:05 +0100
|
||
|
Subject: [PATCH 04/28] url: Moved parsing of login details out of
|
||
|
parse_url_login()
|
||
|
|
||
|
Separated the parsing of login details from the processing of them in
|
||
|
parse_url_login() ready for use by setstropt_userpwd().
|
||
|
|
||
|
Upstream-commit: bb20989a6384f95a73fd68b0e109fc860e0c7a57
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 221 +++++++++++++++++++++++++++++++++++++++++++++-----------------
|
||
|
1 file changed, 161 insertions(+), 60 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index f03ca0f..3396944 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -141,6 +141,9 @@ static CURLcode do_init(struct connectdata *conn);
|
||
|
static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
char *user, char *passwd, char *options);
|
||
|
+static CURLcode parse_login_details(const char *login, const size_t len,
|
||
|
+ char **userptr, char **passwdptr,
|
||
|
+ char **optionsptr);
|
||
|
/*
|
||
|
* Protocol table.
|
||
|
*/
|
||
|
@@ -4267,6 +4270,7 @@ static CURLcode parse_proxy_auth(struct SessionHandle *data,
|
||
|
#endif /* CURL_DISABLE_PROXY */
|
||
|
|
||
|
/*
|
||
|
+ * parse_url_login()
|
||
|
*
|
||
|
* Parse the login details (user name, password and options) from the URL and
|
||
|
* strip them out of the host name
|
||
|
@@ -4285,6 +4289,11 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
char *user, char *passwd, char *options)
|
||
|
{
|
||
|
+ CURLcode result = CURLE_OK;
|
||
|
+ char *userp = NULL;
|
||
|
+ char *passwdp = NULL;
|
||
|
+ char *optionsp = NULL;
|
||
|
+
|
||
|
/* At this point, we're hoping all the other special cases have
|
||
|
* been taken care of, so conn->host.name is at most
|
||
|
* [user[:password][;options]]@]hostname
|
||
|
@@ -4293,7 +4302,7 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
*/
|
||
|
|
||
|
char *ptr = strchr(conn->host.name, '@');
|
||
|
- char *userpass = conn->host.name;
|
||
|
+ char *login = conn->host.name;
|
||
|
|
||
|
user[0] = 0; /* to make everything well-defined */
|
||
|
passwd[0] = 0;
|
||
|
@@ -4302,7 +4311,7 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
/* We will now try to extract the
|
||
|
* possible login information in a string like:
|
||
|
* ftp://user:password@ftp.my.site:8021/README */
|
||
|
- if(ptr != NULL) {
|
||
|
+ if(ptr) {
|
||
|
/* There's login information to the left of the @ */
|
||
|
|
||
|
conn->host.name = ++ptr;
|
||
|
@@ -4314,80 +4323,172 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
*/
|
||
|
|
||
|
if(data->set.use_netrc != CURL_NETRC_REQUIRED) {
|
||
|
- /* We could use the information in the URL so extract it */
|
||
|
- if(*userpass != ':') {
|
||
|
- if(*userpass != ';') {
|
||
|
- /* The user is given so extract the user, password and options */
|
||
|
- int result = sscanf(userpass,
|
||
|
- "%" MAX_CURL_USER_LENGTH_TXT "[^:;@]:"
|
||
|
- "%" MAX_CURL_PASSWORD_LENGTH_TXT "[^;@];"
|
||
|
- "%" MAX_CURL_OPTIONS_LENGTH_TXT "[^@]",
|
||
|
- user, passwd, options);
|
||
|
-
|
||
|
- /* The extract failed so extract the user and options instead */
|
||
|
- if(result == 1)
|
||
|
- sscanf(userpass, "%" MAX_CURL_USER_LENGTH_TXT "[^:;@];"
|
||
|
- "%" MAX_CURL_OPTIONS_LENGTH_TXT "[^@]",
|
||
|
- user, options);
|
||
|
- }
|
||
|
- else {
|
||
|
- /* No name or password are given so extract the options only */
|
||
|
- sscanf(userpass, ";%" MAX_CURL_OPTIONS_LENGTH_TXT "[^@]", options);
|
||
|
+ /* 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)
|
||
|
+ return CURLE_OUT_OF_MEMORY;
|
||
|
+
|
||
|
+ if(strlen(newname) < MAX_CURL_USER_LENGTH)
|
||
|
+ strcpy(user, newname);
|
||
|
+
|
||
|
+ free(newname);
|
||
|
}
|
||
|
- }
|
||
|
- else
|
||
|
- /* No name is given so extract the password and options */
|
||
|
- sscanf(userpass, ":%" MAX_CURL_PASSWORD_LENGTH_TXT "[^;@];"
|
||
|
- "%" MAX_CURL_OPTIONS_LENGTH_TXT "[^@]",
|
||
|
- passwd, options);
|
||
|
|
||
|
- if(user[0]) {
|
||
|
- char *newname;
|
||
|
+ if(passwdp) {
|
||
|
+ /* We have a password in the URL so decode it */
|
||
|
+ char *newpasswd = curl_easy_unescape(data, passwdp, 0, NULL);
|
||
|
+ if(!newpasswd)
|
||
|
+ return CURLE_OUT_OF_MEMORY;
|
||
|
|
||
|
- /* We have a user in the URL */
|
||
|
- conn->bits.userpwd_in_url = TRUE;
|
||
|
- conn->bits.user_passwd = TRUE; /* enable user+password */
|
||
|
+ if(strlen(newpasswd) < MAX_CURL_PASSWORD_LENGTH)
|
||
|
+ strcpy(passwd, newpasswd);
|
||
|
|
||
|
- /* Decode the user */
|
||
|
- newname = curl_easy_unescape(data, user, 0, NULL);
|
||
|
- if(!newname)
|
||
|
- return CURLE_OUT_OF_MEMORY;
|
||
|
+ 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)
|
||
|
+ return CURLE_OUT_OF_MEMORY;
|
||
|
|
||
|
- if(strlen(newname) < MAX_CURL_USER_LENGTH)
|
||
|
- strcpy(user, newname);
|
||
|
+ if(strlen(newoptions) < MAX_CURL_OPTIONS_LENGTH)
|
||
|
+ strcpy(options, newoptions);
|
||
|
|
||
|
- /* if the new name is longer than accepted, then just use
|
||
|
- the unconverted name, it'll be wrong but what the heck */
|
||
|
- free(newname);
|
||
|
+ free(newoptions);
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
- if(passwd[0]) {
|
||
|
- /* We have a password in the URL so decode it */
|
||
|
- char *newpasswd = curl_easy_unescape(data, passwd, 0, NULL);
|
||
|
- if(!newpasswd)
|
||
|
- return CURLE_OUT_OF_MEMORY;
|
||
|
+ Curl_safefree(userp);
|
||
|
+ Curl_safefree(passwdp);
|
||
|
+ Curl_safefree(optionsp);
|
||
|
+ }
|
||
|
+ }
|
||
|
|
||
|
- if(strlen(newpasswd) < MAX_CURL_PASSWORD_LENGTH)
|
||
|
- strcpy(passwd, newpasswd);
|
||
|
+ return result;
|
||
|
+}
|
||
|
|
||
|
- free(newpasswd);
|
||
|
- }
|
||
|
+/*
|
||
|
+ * parse_login_details()
|
||
|
+ *
|
||
|
+ * This is used to parse a login string for user name, password and options in
|
||
|
+ * the following formats:
|
||
|
+ *
|
||
|
+ * user
|
||
|
+ * user:password
|
||
|
+ * user:password;options
|
||
|
+ * user;options
|
||
|
+ * user;options:password
|
||
|
+ * :password
|
||
|
+ * :password;options
|
||
|
+ * ;options
|
||
|
+ * ;options:password
|
||
|
+ *
|
||
|
+ * Parameters:
|
||
|
+ *
|
||
|
+ * login [in] - The login string.
|
||
|
+ * len [in] - The length of the login string.
|
||
|
+ * userp [in/out] - The address where a pointer to newly allocated memory
|
||
|
+ * holding the user will be stored upon completion.
|
||
|
+ * passdwp [in/out] - The address where a pointer to newly allocated memory
|
||
|
+ * holding the password will be stored upon completion.
|
||
|
+ * optionsp [in/out] - The address where a pointer to newly allocated memory
|
||
|
+ * holding the options will be stored upon completion.
|
||
|
+ *
|
||
|
+ * Returns CURLE_OK on success.
|
||
|
+ */
|
||
|
+static CURLcode parse_login_details(const char *login, const size_t len,
|
||
|
+ char **userp, char **passwdp,
|
||
|
+ char **optionsp)
|
||
|
+{
|
||
|
+ CURLcode result = CURLE_OK;
|
||
|
+ char *utemp = NULL;
|
||
|
+ char *ptemp = NULL;
|
||
|
+ char *otemp = NULL;
|
||
|
+ const char *psep = NULL;
|
||
|
+ const char *osep = NULL;
|
||
|
+ size_t ulen;
|
||
|
+ size_t plen;
|
||
|
+ size_t olen;
|
||
|
+
|
||
|
+ /* Attempt to find the password separator */
|
||
|
+ if(passwdp)
|
||
|
+ psep = strchr(login, ':');
|
||
|
+
|
||
|
+ /* Attempt to find the options separator */
|
||
|
+ if(optionsp)
|
||
|
+ osep = strchr(login, ';');
|
||
|
+
|
||
|
+ /* Calculate the portion lengths */
|
||
|
+ ulen = (psep ?
|
||
|
+ (size_t)(osep && psep > osep ? osep - login : psep - login) :
|
||
|
+ (osep ? (size_t)(osep - login) : len));
|
||
|
+ plen = (psep ?
|
||
|
+ (osep && osep > psep ? (size_t)(osep - psep) :
|
||
|
+ (size_t)(login + len - psep)) - 1 : 0);
|
||
|
+ olen = (osep ?
|
||
|
+ (psep && psep > osep ? (size_t)(psep - osep) :
|
||
|
+ (size_t)(login + len - osep)) - 1 : 0);
|
||
|
+
|
||
|
+ /* Allocate the user portion temporary buffer */
|
||
|
+ if(userp && ulen) {
|
||
|
+ utemp = malloc(ulen + 1);
|
||
|
+ if(!utemp)
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* Allocate the password portion temporary buffer */
|
||
|
+ if(!result && passwdp && plen) {
|
||
|
+ ptemp = malloc(plen + 1);
|
||
|
+ if(!ptemp)
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* Allocate the options portion temporary buffer */
|
||
|
+ if(!result && optionsp && olen) {
|
||
|
+ otemp = malloc(olen + 1);
|
||
|
+ if(!otemp)
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ }
|
||
|
|
||
|
- if(options[0]) {
|
||
|
- /* We have an options list in the URL so decode it */
|
||
|
- char *newoptions = curl_easy_unescape(data, options, 0, NULL);
|
||
|
- if(!newoptions)
|
||
|
- return CURLE_OUT_OF_MEMORY;
|
||
|
+ if(!result) {
|
||
|
+ /* Copy the user portion if necessary */
|
||
|
+ if(utemp) {
|
||
|
+ memcpy(utemp, login, ulen);
|
||
|
+ utemp[ulen] = '\0';
|
||
|
+ Curl_safefree(*userp);
|
||
|
+ *userp = utemp;
|
||
|
+ }
|
||
|
|
||
|
- if(strlen(newoptions) < MAX_CURL_OPTIONS_LENGTH)
|
||
|
- strcpy(options, newoptions);
|
||
|
+ /* Copy the password portion if necessary */
|
||
|
+ if(ptemp) {
|
||
|
+ memcpy(ptemp, psep + 1, plen);
|
||
|
+ ptemp[plen] = '\0';
|
||
|
+ Curl_safefree(*passwdp);
|
||
|
+ *passwdp = ptemp;
|
||
|
+ }
|
||
|
|
||
|
- free(newoptions);
|
||
|
- }
|
||
|
+ /* Copy the options portion if necessary */
|
||
|
+ if(otemp) {
|
||
|
+ memcpy(otemp, osep + 1, olen);
|
||
|
+ otemp[olen] = '\0';
|
||
|
+ Curl_safefree(*optionsp);
|
||
|
+ *optionsp = otemp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- return CURLE_OK;
|
||
|
+ return result;
|
||
|
}
|
||
|
|
||
|
/*************************************************************
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From ce1718fc19267ca33e61ac4bff2e3867d6ed460c Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Fri, 19 Apr 2013 19:37:55 +0100
|
||
|
Subject: [PATCH 05/28] url: Added bounds checking to parse_login_details()
|
||
|
|
||
|
Added bounds checking when searching for the separator characters within
|
||
|
the login string as this string may not be NULL terminated (For example
|
||
|
it is the login part of a URL). We do this in preference to allocating a
|
||
|
new string to copy the login details into which could then be passed to
|
||
|
parse_login_details() for performance reasons.
|
||
|
|
||
|
Upstream-commit: 49184c37233c2cf27b79ebcd29fb8a4f5fb2e1ed
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 14 ++++++++++++--
|
||
|
1 file changed, 12 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 3396944..5381872 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4423,13 +4423,23 @@ static CURLcode parse_login_details(const char *login, const size_t len,
|
||
|
size_t olen;
|
||
|
|
||
|
/* Attempt to find the password separator */
|
||
|
- if(passwdp)
|
||
|
+ if(passwdp) {
|
||
|
psep = strchr(login, ':');
|
||
|
|
||
|
+ /* Within the constraint of the login string */
|
||
|
+ if(psep >= login + len)
|
||
|
+ psep = NULL;
|
||
|
+ }
|
||
|
+
|
||
|
/* Attempt to find the options separator */
|
||
|
- if(optionsp)
|
||
|
+ if(optionsp) {
|
||
|
osep = strchr(login, ';');
|
||
|
|
||
|
+ /* Within the constraint of the login string */
|
||
|
+ if(osep >= login + len)
|
||
|
+ osep = NULL;
|
||
|
+ }
|
||
|
+
|
||
|
/* Calculate the portion lengths */
|
||
|
ulen = (psep ?
|
||
|
(size_t)(osep && psep > osep ? osep - login : psep - login) :
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From fb76a0dac86f2b82f68b6b3b7538b5057d1c04d9 Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sat, 20 Apr 2013 08:47:59 +0100
|
||
|
Subject: [PATCH 06/28] url: Added support for parsing login options from the
|
||
|
CURLOPT_USERPWD
|
||
|
|
||
|
In addition to parsing the optional login options from the URL, added
|
||
|
support for parsing them from CURLOPT_USERPWD, to allow the following
|
||
|
supported command line:
|
||
|
|
||
|
--user username:password;options
|
||
|
|
||
|
Upstream-commit: fddb7b44a79d78e05043e1c97e069308b6b85f79
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 66 ++++++++++++++++++++++++++++++++++-------------------------
|
||
|
lib/urldata.h | 1 +
|
||
|
2 files changed, 39 insertions(+), 28 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 5381872..0a47143 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -295,43 +295,52 @@ static CURLcode setstropt(char **charp, char * s)
|
||
|
}
|
||
|
|
||
|
static CURLcode setstropt_userpwd(char *option, char **user_storage,
|
||
|
- char **pwd_storage)
|
||
|
+ char **pwd_storage, char **options_storage)
|
||
|
{
|
||
|
- char* separator;
|
||
|
CURLcode result = CURLE_OK;
|
||
|
+ char *userp = NULL;
|
||
|
+ char *passwdp = NULL;
|
||
|
+ char *optionsp = NULL;
|
||
|
|
||
|
if(!option) {
|
||
|
/* we treat a NULL passed in as a hint to clear existing info */
|
||
|
- Curl_safefree(*user_storage);
|
||
|
- *user_storage = (char *) NULL;
|
||
|
- Curl_safefree(*pwd_storage);
|
||
|
- *pwd_storage = (char *) NULL;
|
||
|
+ if(user_storage) {
|
||
|
+ Curl_safefree(*user_storage);
|
||
|
+ *user_storage = (char *) NULL;
|
||
|
+ }
|
||
|
+
|
||
|
+ if(pwd_storage) {
|
||
|
+ Curl_safefree(*pwd_storage);
|
||
|
+ *pwd_storage = (char *) NULL;
|
||
|
+ }
|
||
|
+
|
||
|
+ if(options_storage) {
|
||
|
+ Curl_safefree(*options_storage);
|
||
|
+ *options_storage = (char *) NULL;
|
||
|
+ }
|
||
|
+
|
||
|
return CURLE_OK;
|
||
|
}
|
||
|
|
||
|
- separator = strchr(option, ':');
|
||
|
- if(separator != NULL) {
|
||
|
-
|
||
|
+ /* Parse the login details */
|
||
|
+ result = parse_login_details(option, strlen(option),
|
||
|
+ (user_storage ? &userp : NULL),
|
||
|
+ (pwd_storage ? &passwdp : NULL),
|
||
|
+ (options_storage ? &optionsp : NULL));
|
||
|
+ if(!result) {
|
||
|
/* store username part of option */
|
||
|
- char * p;
|
||
|
- size_t username_len = (size_t)(separator-option);
|
||
|
- p = malloc(username_len+1);
|
||
|
- if(!p)
|
||
|
- result = CURLE_OUT_OF_MEMORY;
|
||
|
- else {
|
||
|
- memcpy(p, option, username_len);
|
||
|
- p[username_len] = '\0';
|
||
|
- Curl_safefree(*user_storage);
|
||
|
- *user_storage = p;
|
||
|
- }
|
||
|
+ if(user_storage)
|
||
|
+ setstropt(user_storage, userp);
|
||
|
|
||
|
/* store password part of option */
|
||
|
- if(result == CURLE_OK)
|
||
|
- result = setstropt(pwd_storage, separator+1);
|
||
|
- }
|
||
|
- else {
|
||
|
- result = setstropt(user_storage, option);
|
||
|
+ if(pwd_storage)
|
||
|
+ setstropt(pwd_storage, passwdp);
|
||
|
+
|
||
|
+ /* store options part of option */
|
||
|
+ if(options_storage)
|
||
|
+ setstropt(options_storage, optionsp);
|
||
|
}
|
||
|
+
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
@@ -1546,11 +1555,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
||
|
|
||
|
case CURLOPT_USERPWD:
|
||
|
/*
|
||
|
- * user:password to use in the operation
|
||
|
+ * user:password;options to use in the operation
|
||
|
*/
|
||
|
result = setstropt_userpwd(va_arg(param, char *),
|
||
|
&data->set.str[STRING_USERNAME],
|
||
|
- &data->set.str[STRING_PASSWORD]);
|
||
|
+ &data->set.str[STRING_PASSWORD],
|
||
|
+ &data->set.str[STRING_OPTIONS]);
|
||
|
break;
|
||
|
case CURLOPT_USERNAME:
|
||
|
/*
|
||
|
@@ -1623,7 +1633,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
||
|
*/
|
||
|
result = setstropt_userpwd(va_arg(param, char *),
|
||
|
&data->set.str[STRING_PROXYUSERNAME],
|
||
|
- &data->set.str[STRING_PROXYPASSWORD]);
|
||
|
+ &data->set.str[STRING_PROXYPASSWORD], NULL);
|
||
|
break;
|
||
|
case CURLOPT_PROXYUSERNAME:
|
||
|
/*
|
||
|
diff --git a/lib/urldata.h b/lib/urldata.h
|
||
|
index 46ef5d5..1c2281a 100644
|
||
|
--- a/lib/urldata.h
|
||
|
+++ b/lib/urldata.h
|
||
|
@@ -1354,6 +1354,7 @@ enum dupstring {
|
||
|
STRING_SSL_ISSUERCERT, /* issuer cert file to check certificate */
|
||
|
STRING_USERNAME, /* <username>, if used */
|
||
|
STRING_PASSWORD, /* <password>, if used */
|
||
|
+ STRING_OPTIONS, /* <options>, if used */
|
||
|
STRING_PROXYUSERNAME, /* Proxy <username>, if used */
|
||
|
STRING_PROXYPASSWORD, /* Proxy <password>, if used */
|
||
|
STRING_NOPROXY, /* List of hosts which should not use the proxy, if
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 32f237261f2c7592db3ba6378c053e63abb744ce Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sat, 20 Apr 2013 09:06:53 +0100
|
||
|
Subject: [PATCH 07/28] url: Added overriding of URL login options from
|
||
|
CURLOPT_USERPWD
|
||
|
|
||
|
Upstream-commit: d535c4a2e1f78d4b54767d67e17cca805e2d1f7c
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 31 +++++++++++++++++--------------
|
||
|
1 file changed, 17 insertions(+), 14 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 0a47143..8b7aa3a 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4631,20 +4631,26 @@ static CURLcode parse_remote_port(struct SessionHandle *data,
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
- * Override a user name and password from the URL with that in the
|
||
|
- * CURLOPT_USERPWD option or a .netrc file, if applicable.
|
||
|
+ * Override the login details from the URL with that in the CURLOPT_USERPWD
|
||
|
+ * option or a .netrc file, if applicable.
|
||
|
*/
|
||
|
-static void override_userpass(struct SessionHandle *data,
|
||
|
- struct connectdata *conn,
|
||
|
- char *user, char *passwd)
|
||
|
+static void override_login(struct SessionHandle *data,
|
||
|
+ struct connectdata *conn,
|
||
|
+ char *user, char *passwd, char *options)
|
||
|
{
|
||
|
- if(data->set.str[STRING_USERNAME] != NULL) {
|
||
|
+ if(data->set.str[STRING_USERNAME]) {
|
||
|
strncpy(user, data->set.str[STRING_USERNAME], MAX_CURL_USER_LENGTH);
|
||
|
- user[MAX_CURL_USER_LENGTH-1] = '\0'; /*To be on safe side*/
|
||
|
+ user[MAX_CURL_USER_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
}
|
||
|
- if(data->set.str[STRING_PASSWORD] != NULL) {
|
||
|
+
|
||
|
+ if(data->set.str[STRING_PASSWORD]) {
|
||
|
strncpy(passwd, data->set.str[STRING_PASSWORD], MAX_CURL_PASSWORD_LENGTH);
|
||
|
- passwd[MAX_CURL_PASSWORD_LENGTH-1] = '\0'; /*To be on safe side*/
|
||
|
+ passwd[MAX_CURL_PASSWORD_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
+ }
|
||
|
+
|
||
|
+ if(data->set.str[STRING_OPTIONS]) {
|
||
|
+ strncpy(options, data->set.str[STRING_OPTIONS], MAX_CURL_OPTIONS_LENGTH);
|
||
|
+ options[MAX_CURL_OPTIONS_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
}
|
||
|
|
||
|
conn->bits.netrc = FALSE;
|
||
|
@@ -5149,11 +5155,8 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
if(result != CURLE_OK)
|
||
|
return result;
|
||
|
|
||
|
- /*************************************************************
|
||
|
- * Check for an overridden user name and password, then set it
|
||
|
- * for use
|
||
|
- *************************************************************/
|
||
|
- override_userpass(data, conn, user, passwd);
|
||
|
+ /* Check for overridden login details and set them accordingly */
|
||
|
+ override_login(data, conn, user, passwd, options);
|
||
|
result = set_login(conn, user, passwd, options);
|
||
|
if(result != CURLE_OK)
|
||
|
return result;
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 4876aa898d1d0b012328c3ddc96fd2023464584e Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sat, 20 Apr 2013 18:40:13 +0100
|
||
|
Subject: [PATCH 08/28] url: Fixed memory leak in setstropt_userpwd()
|
||
|
|
||
|
setstropt_userpwd() was calling setstropt() in commit fddb7b44a79d to
|
||
|
set each of the login details which would duplicate the strings and
|
||
|
subsequently cause a memory leak.
|
||
|
|
||
|
Upstream-commit: fe880475ed3c7e51e32e19112252c79e921cc31b
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 9 ++++++---
|
||
|
1 file changed, 6 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 8b7aa3a..5e27818 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -330,15 +330,18 @@ static CURLcode setstropt_userpwd(char *option, char **user_storage,
|
||
|
if(!result) {
|
||
|
/* store username part of option */
|
||
|
if(user_storage)
|
||
|
- setstropt(user_storage, userp);
|
||
|
+ Curl_safefree(*user_storage);
|
||
|
+ *user_storage = userp;
|
||
|
|
||
|
/* store password part of option */
|
||
|
if(pwd_storage)
|
||
|
- setstropt(pwd_storage, passwdp);
|
||
|
+ Curl_safefree(*pwd_storage);
|
||
|
+ *pwd_storage = passwdp;
|
||
|
|
||
|
/* store options part of option */
|
||
|
if(options_storage)
|
||
|
- setstropt(options_storage, optionsp);
|
||
|
+ Curl_safefree(*options_storage);
|
||
|
+ *options_storage = optionsp;
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From d0d89877466515b3ec17bc7c5987f4fec906e92e Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sat, 20 Apr 2013 19:10:10 +0100
|
||
|
Subject: [PATCH 09/28] url: Correction to scope of if statements when setting
|
||
|
data
|
||
|
|
||
|
Upstream-commit: e99c81a07c0c8752a286e0f14174ae7ae114090c
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 9 ++++++---
|
||
|
1 file changed, 6 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 5e27818..ffd80a5 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -329,19 +329,22 @@ static CURLcode setstropt_userpwd(char *option, char **user_storage,
|
||
|
(options_storage ? &optionsp : NULL));
|
||
|
if(!result) {
|
||
|
/* store username part of option */
|
||
|
- if(user_storage)
|
||
|
+ if(user_storage) {
|
||
|
Curl_safefree(*user_storage);
|
||
|
*user_storage = userp;
|
||
|
+ }
|
||
|
|
||
|
/* store password part of option */
|
||
|
- if(pwd_storage)
|
||
|
+ if(pwd_storage) {
|
||
|
Curl_safefree(*pwd_storage);
|
||
|
*pwd_storage = passwdp;
|
||
|
+ }
|
||
|
|
||
|
/* store options part of option */
|
||
|
- if(options_storage)
|
||
|
+ if(options_storage) {
|
||
|
Curl_safefree(*options_storage);
|
||
|
*options_storage = optionsp;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From f45b4761cdb3b88647aa4b7eee89bb45dfd7c7bc Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sat, 20 Apr 2013 20:01:40 +0100
|
||
|
Subject: [PATCH 10/28] url: Simplified setstropt_userpwd() following recent
|
||
|
changes
|
||
|
|
||
|
There is no need to perform separate clearing of data if a NULL option
|
||
|
pointer is passed in. Instead this operation can be performed by simply
|
||
|
not calling parse_login_details() and letting the rest of the code do
|
||
|
the work.
|
||
|
|
||
|
Upstream-commit: bddf3d4705ed8e0999200c92de191db8e2441b3a
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 30 +++++++-----------------------
|
||
|
1 file changed, 7 insertions(+), 23 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index ffd80a5..5f1bef2 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -302,31 +302,15 @@ static CURLcode setstropt_userpwd(char *option, char **user_storage,
|
||
|
char *passwdp = NULL;
|
||
|
char *optionsp = NULL;
|
||
|
|
||
|
- if(!option) {
|
||
|
- /* we treat a NULL passed in as a hint to clear existing info */
|
||
|
- if(user_storage) {
|
||
|
- Curl_safefree(*user_storage);
|
||
|
- *user_storage = (char *) NULL;
|
||
|
- }
|
||
|
-
|
||
|
- if(pwd_storage) {
|
||
|
- Curl_safefree(*pwd_storage);
|
||
|
- *pwd_storage = (char *) NULL;
|
||
|
- }
|
||
|
-
|
||
|
- if(options_storage) {
|
||
|
- Curl_safefree(*options_storage);
|
||
|
- *options_storage = (char *) NULL;
|
||
|
- }
|
||
|
-
|
||
|
- return CURLE_OK;
|
||
|
+ /* Parse the login details if specified. It not then we treat NULL as a hint
|
||
|
+ to clear the existing data */
|
||
|
+ if(option) {
|
||
|
+ result = parse_login_details(option, strlen(option),
|
||
|
+ (user_storage ? &userp : NULL),
|
||
|
+ (pwd_storage ? &passwdp : NULL),
|
||
|
+ (options_storage ? &optionsp : NULL));
|
||
|
}
|
||
|
|
||
|
- /* Parse the login details */
|
||
|
- result = parse_login_details(option, strlen(option),
|
||
|
- (user_storage ? &userp : NULL),
|
||
|
- (pwd_storage ? &passwdp : NULL),
|
||
|
- (options_storage ? &optionsp : NULL));
|
||
|
if(!result) {
|
||
|
/* store username part of option */
|
||
|
if(user_storage) {
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 34d2d13cdc6a50ea80c45366ea78487cca8f0fc4 Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sun, 21 Apr 2013 10:08:17 +0100
|
||
|
Subject: [PATCH 11/28] url: Tidy up of code and comments following recent
|
||
|
changes
|
||
|
|
||
|
Tidy up of variable names and comments in setstropt_userpwd() and
|
||
|
parse_login_details().
|
||
|
|
||
|
Upstream-commit: e8a9f794f048251f94d59cc1d4ef7e9516b0c4e7
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 84 +++++++++++++++++++++++++++++++--------------------------------
|
||
|
1 file changed, 42 insertions(+), 42 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 5f1bef2..5f9fd6f 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -261,7 +261,7 @@ static const struct Curl_handler Curl_handler_dummy = {
|
||
|
PROTOPT_NONE /* flags */
|
||
|
};
|
||
|
|
||
|
-void Curl_freeset(struct SessionHandle * data)
|
||
|
+void Curl_freeset(struct SessionHandle *data)
|
||
|
{
|
||
|
/* Free all dynamic strings stored in the data->set substructure. */
|
||
|
enum dupstring i;
|
||
|
@@ -275,7 +275,7 @@ void Curl_freeset(struct SessionHandle * data)
|
||
|
data->change.referer = NULL;
|
||
|
}
|
||
|
|
||
|
-static CURLcode setstropt(char **charp, char * s)
|
||
|
+static CURLcode setstropt(char **charp, char *s)
|
||
|
{
|
||
|
/* Release the previous storage at `charp' and replace by a dynamic storage
|
||
|
copy of `s'. Return CURLE_OK or CURLE_OUT_OF_MEMORY. */
|
||
|
@@ -298,43 +298,43 @@ static CURLcode setstropt_userpwd(char *option, char **user_storage,
|
||
|
char **pwd_storage, char **options_storage)
|
||
|
{
|
||
|
CURLcode result = CURLE_OK;
|
||
|
- char *userp = NULL;
|
||
|
- char *passwdp = NULL;
|
||
|
- char *optionsp = NULL;
|
||
|
+ char *user = NULL;
|
||
|
+ char *passwd = NULL;
|
||
|
+ char *options = NULL;
|
||
|
|
||
|
/* Parse the login details if specified. It not then we treat NULL as a hint
|
||
|
to clear the existing data */
|
||
|
if(option) {
|
||
|
result = parse_login_details(option, strlen(option),
|
||
|
- (user_storage ? &userp : NULL),
|
||
|
- (pwd_storage ? &passwdp : NULL),
|
||
|
- (options_storage ? &optionsp : NULL));
|
||
|
+ (user_storage ? &user : NULL),
|
||
|
+ (pwd_storage ? &passwd : NULL),
|
||
|
+ (options_storage ? &options : NULL));
|
||
|
}
|
||
|
|
||
|
if(!result) {
|
||
|
- /* store username part of option */
|
||
|
+ /* Store the username part of option if required */
|
||
|
if(user_storage) {
|
||
|
Curl_safefree(*user_storage);
|
||
|
- *user_storage = userp;
|
||
|
+ *user_storage = user;
|
||
|
}
|
||
|
|
||
|
- /* store password part of option */
|
||
|
+ /* Store the password part of option if required */
|
||
|
if(pwd_storage) {
|
||
|
Curl_safefree(*pwd_storage);
|
||
|
- *pwd_storage = passwdp;
|
||
|
+ *pwd_storage = passwd;
|
||
|
}
|
||
|
|
||
|
- /* store options part of option */
|
||
|
+ /* Store the options part of option if required */
|
||
|
if(options_storage) {
|
||
|
Curl_safefree(*options_storage);
|
||
|
- *options_storage = optionsp;
|
||
|
+ *options_storage = options;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
-CURLcode Curl_dupset(struct SessionHandle * dst, struct SessionHandle * src)
|
||
|
+CURLcode Curl_dupset(struct SessionHandle *dst, struct SessionHandle *src)
|
||
|
{
|
||
|
CURLcode r = CURLE_OK;
|
||
|
enum dupstring i;
|
||
|
@@ -4413,9 +4413,9 @@ static CURLcode parse_login_details(const char *login, const size_t len,
|
||
|
char **optionsp)
|
||
|
{
|
||
|
CURLcode result = CURLE_OK;
|
||
|
- char *utemp = NULL;
|
||
|
- char *ptemp = NULL;
|
||
|
- char *otemp = NULL;
|
||
|
+ char *ubuf = NULL;
|
||
|
+ char *pbuf = NULL;
|
||
|
+ char *obuf = NULL;
|
||
|
const char *psep = NULL;
|
||
|
const char *osep = NULL;
|
||
|
size_t ulen;
|
||
|
@@ -4451,50 +4451,50 @@ static CURLcode parse_login_details(const char *login, const size_t len,
|
||
|
(psep && psep > osep ? (size_t)(psep - osep) :
|
||
|
(size_t)(login + len - osep)) - 1 : 0);
|
||
|
|
||
|
- /* Allocate the user portion temporary buffer */
|
||
|
+ /* Allocate the user portion buffer */
|
||
|
if(userp && ulen) {
|
||
|
- utemp = malloc(ulen + 1);
|
||
|
- if(!utemp)
|
||
|
+ ubuf = malloc(ulen + 1);
|
||
|
+ if(!ubuf)
|
||
|
result = CURLE_OUT_OF_MEMORY;
|
||
|
}
|
||
|
|
||
|
- /* Allocate the password portion temporary buffer */
|
||
|
+ /* Allocate the password portion buffer */
|
||
|
if(!result && passwdp && plen) {
|
||
|
- ptemp = malloc(plen + 1);
|
||
|
- if(!ptemp)
|
||
|
+ pbuf = malloc(plen + 1);
|
||
|
+ if(!pbuf)
|
||
|
result = CURLE_OUT_OF_MEMORY;
|
||
|
}
|
||
|
|
||
|
- /* Allocate the options portion temporary buffer */
|
||
|
+ /* Allocate the options portion buffer */
|
||
|
if(!result && optionsp && olen) {
|
||
|
- otemp = malloc(olen + 1);
|
||
|
- if(!otemp)
|
||
|
+ obuf = malloc(olen + 1);
|
||
|
+ if(!obuf)
|
||
|
result = CURLE_OUT_OF_MEMORY;
|
||
|
}
|
||
|
|
||
|
if(!result) {
|
||
|
- /* Copy the user portion if necessary */
|
||
|
- if(utemp) {
|
||
|
- memcpy(utemp, login, ulen);
|
||
|
- utemp[ulen] = '\0';
|
||
|
+ /* Store the user portion if necessary */
|
||
|
+ if(ubuf) {
|
||
|
+ memcpy(ubuf, login, ulen);
|
||
|
+ ubuf[ulen] = '\0';
|
||
|
Curl_safefree(*userp);
|
||
|
- *userp = utemp;
|
||
|
+ *userp = ubuf;
|
||
|
}
|
||
|
|
||
|
- /* Copy the password portion if necessary */
|
||
|
- if(ptemp) {
|
||
|
- memcpy(ptemp, psep + 1, plen);
|
||
|
- ptemp[plen] = '\0';
|
||
|
+ /* Store the password portion if necessary */
|
||
|
+ if(pbuf) {
|
||
|
+ memcpy(pbuf, psep + 1, plen);
|
||
|
+ pbuf[plen] = '\0';
|
||
|
Curl_safefree(*passwdp);
|
||
|
- *passwdp = ptemp;
|
||
|
+ *passwdp = pbuf;
|
||
|
}
|
||
|
|
||
|
- /* Copy the options portion if necessary */
|
||
|
- if(otemp) {
|
||
|
- memcpy(otemp, osep + 1, olen);
|
||
|
- otemp[olen] = '\0';
|
||
|
+ /* Store the options portion if necessary */
|
||
|
+ if(obuf) {
|
||
|
+ memcpy(obuf, osep + 1, olen);
|
||
|
+ obuf[olen] = '\0';
|
||
|
Curl_safefree(*optionsp);
|
||
|
- *optionsp = otemp;
|
||
|
+ *optionsp = obuf;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 58e3995c51150621185e9e0ebcbd943403a2df9c Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sun, 21 Apr 2013 10:16:51 +0100
|
||
|
Subject: [PATCH 12/28] url: Tidy up of setstropt_userpwd() parameters
|
||
|
|
||
|
Updated the naming convention of the login parameters to match those of
|
||
|
other functions.
|
||
|
|
||
|
Upstream-commit: 702b0dd408d5e847aad99d44dcd79366c61835eb
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 28 ++++++++++++++--------------
|
||
|
1 file changed, 14 insertions(+), 14 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 5f9fd6f..2e691c3 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -294,8 +294,8 @@ static CURLcode setstropt(char **charp, char *s)
|
||
|
return CURLE_OK;
|
||
|
}
|
||
|
|
||
|
-static CURLcode setstropt_userpwd(char *option, char **user_storage,
|
||
|
- char **pwd_storage, char **options_storage)
|
||
|
+static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp,
|
||
|
+ char **optionsp)
|
||
|
{
|
||
|
CURLcode result = CURLE_OK;
|
||
|
char *user = NULL;
|
||
|
@@ -306,28 +306,28 @@ static CURLcode setstropt_userpwd(char *option, char **user_storage,
|
||
|
to clear the existing data */
|
||
|
if(option) {
|
||
|
result = parse_login_details(option, strlen(option),
|
||
|
- (user_storage ? &user : NULL),
|
||
|
- (pwd_storage ? &passwd : NULL),
|
||
|
- (options_storage ? &options : NULL));
|
||
|
+ (userp ? &user : NULL),
|
||
|
+ (passwdp ? &passwd : NULL),
|
||
|
+ (optionsp ? &options : NULL));
|
||
|
}
|
||
|
|
||
|
if(!result) {
|
||
|
/* Store the username part of option if required */
|
||
|
- if(user_storage) {
|
||
|
- Curl_safefree(*user_storage);
|
||
|
- *user_storage = user;
|
||
|
+ if(userp) {
|
||
|
+ Curl_safefree(*userp);
|
||
|
+ *userp = user;
|
||
|
}
|
||
|
|
||
|
/* Store the password part of option if required */
|
||
|
- if(pwd_storage) {
|
||
|
- Curl_safefree(*pwd_storage);
|
||
|
- *pwd_storage = passwd;
|
||
|
+ if(passwdp) {
|
||
|
+ Curl_safefree(*passwdp);
|
||
|
+ *passwdp = passwd;
|
||
|
}
|
||
|
|
||
|
/* Store the options part of option if required */
|
||
|
- if(options_storage) {
|
||
|
- Curl_safefree(*options_storage);
|
||
|
- *options_storage = options;
|
||
|
+ if(optionsp) {
|
||
|
+ Curl_safefree(*optionsp);
|
||
|
+ *optionsp = options;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 956dfd17565bb95ebf8cd7f7a2fe5a76e7da1898 Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sun, 21 Apr 2013 12:08:35 +0100
|
||
|
Subject: [PATCH 13/28] url: Updated proxy URL parsing to use
|
||
|
parse_login_details()
|
||
|
|
||
|
Upstream-commit: 11332577b3cbd76f9fc418f3ae11133e4089fa1c
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 26 +++++++++++++-------------
|
||
|
1 file changed, 13 insertions(+), 13 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 2e691c3..a272087 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4137,16 +4137,13 @@ static CURLcode parse_proxy(struct SessionHandle *data,
|
||
|
/* Is there a username and password given in this proxy url? */
|
||
|
atsign = strchr(proxyptr, '@');
|
||
|
if(atsign) {
|
||
|
- char proxyuser[MAX_CURL_USER_LENGTH];
|
||
|
- char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
|
||
|
- proxypasswd[0] = 0;
|
||
|
-
|
||
|
- if(1 <= sscanf(proxyptr,
|
||
|
- "%" MAX_CURL_USER_LENGTH_TXT"[^:@]:"
|
||
|
- "%" MAX_CURL_PASSWORD_LENGTH_TXT "[^@]",
|
||
|
- proxyuser, proxypasswd)) {
|
||
|
- CURLcode res = CURLE_OK;
|
||
|
+ CURLcode res = CURLE_OK;
|
||
|
+ char *proxyuser = NULL;
|
||
|
+ char *proxypasswd = NULL;
|
||
|
|
||
|
+ res = parse_login_details(proxyptr, atsign - proxyptr,
|
||
|
+ &proxyuser, &proxypasswd, NULL);
|
||
|
+ if(!res) {
|
||
|
/* found user and password, rip them out. note that we are
|
||
|
unescaping them, as there is otherwise no way to have a
|
||
|
username or password with reserved characters like ':' in
|
||
|
@@ -4164,7 +4161,7 @@ static CURLcode parse_proxy(struct SessionHandle *data,
|
||
|
res = CURLE_OUT_OF_MEMORY;
|
||
|
}
|
||
|
|
||
|
- if(CURLE_OK == res) {
|
||
|
+ if(!res) {
|
||
|
conn->bits.proxy_user_passwd = TRUE; /* enable it */
|
||
|
atsign++; /* the right side of the @-letter */
|
||
|
|
||
|
@@ -4173,10 +4170,13 @@ static CURLcode parse_proxy(struct SessionHandle *data,
|
||
|
else
|
||
|
res = CURLE_OUT_OF_MEMORY;
|
||
|
}
|
||
|
-
|
||
|
- if(res)
|
||
|
- return res;
|
||
|
}
|
||
|
+
|
||
|
+ Curl_safefree(proxyuser);
|
||
|
+ Curl_safefree(proxypasswd);
|
||
|
+
|
||
|
+ if(res)
|
||
|
+ return res;
|
||
|
}
|
||
|
|
||
|
/* start scanning for port number at this point */
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From e2480db78651e3d1e2f5939d09b7ada54af0bdf4 Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sun, 21 Apr 2013 16:55:19 +0100
|
||
|
Subject: [PATCH 14/28] url: Fixed crash when no username or password supplied
|
||
|
for proxy
|
||
|
|
||
|
Fixed an issue in parse_proxy(), introduced in commit 11332577b3cb,
|
||
|
where an empty username or password (For example: http://:@example.com)
|
||
|
would cause a crash.
|
||
|
|
||
|
Upstream-commit: 416ecc15845c4e6bf7ea6359d9c63adec3385f5b
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 10 ++++++++--
|
||
|
1 file changed, 8 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index a272087..736f4d9 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4149,13 +4149,19 @@ static CURLcode parse_proxy(struct SessionHandle *data,
|
||
|
username or password with reserved characters like ':' in
|
||
|
them. */
|
||
|
Curl_safefree(conn->proxyuser);
|
||
|
- conn->proxyuser = curl_easy_unescape(data, proxyuser, 0, NULL);
|
||
|
+ if(proxyuser)
|
||
|
+ conn->proxyuser = curl_easy_unescape(data, proxyuser, 0, NULL);
|
||
|
+ else
|
||
|
+ conn->proxyuser = strdup("");
|
||
|
|
||
|
if(!conn->proxyuser)
|
||
|
res = CURLE_OUT_OF_MEMORY;
|
||
|
else {
|
||
|
Curl_safefree(conn->proxypasswd);
|
||
|
- conn->proxypasswd = curl_easy_unescape(data, proxypasswd, 0, NULL);
|
||
|
+ if(proxypasswd)
|
||
|
+ conn->proxypasswd = curl_easy_unescape(data, proxypasswd, 0, NULL);
|
||
|
+ else
|
||
|
+ conn->proxypasswd = strdup("");
|
||
|
|
||
|
if(!conn->proxypasswd)
|
||
|
res = CURLE_OUT_OF_MEMORY;
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From c77ec0c919be4f86cd5fb70fa6813b28b376f48e Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sun, 21 Apr 2013 18:29:33 +0100
|
||
|
Subject: [PATCH 15/28] url: Fixed missing length check in parse_proxy()
|
||
|
|
||
|
Commit 11332577b3cb removed the length check that was performed by the
|
||
|
old scanf() code.
|
||
|
|
||
|
Upstream-commit: ddac43b38e3fd923b71554126652b05e034d6900
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 4 ++--
|
||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 736f4d9..ede7d1c 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4149,7 +4149,7 @@ static CURLcode parse_proxy(struct SessionHandle *data,
|
||
|
username or password with reserved characters like ':' in
|
||
|
them. */
|
||
|
Curl_safefree(conn->proxyuser);
|
||
|
- if(proxyuser)
|
||
|
+ if(proxyuser && strlen(proxyuser) < MAX_CURL_USER_LENGTH)
|
||
|
conn->proxyuser = curl_easy_unescape(data, proxyuser, 0, NULL);
|
||
|
else
|
||
|
conn->proxyuser = strdup("");
|
||
|
@@ -4158,7 +4158,7 @@ static CURLcode parse_proxy(struct SessionHandle *data,
|
||
|
res = CURLE_OUT_OF_MEMORY;
|
||
|
else {
|
||
|
Curl_safefree(conn->proxypasswd);
|
||
|
- if(proxypasswd)
|
||
|
+ if(proxypasswd && strlen(proxypasswd) < MAX_CURL_PASSWORD_LENGTH)
|
||
|
conn->proxypasswd = curl_easy_unescape(data, proxypasswd, 0, NULL);
|
||
|
else
|
||
|
conn->proxypasswd = strdup("");
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 4d396dba81cde42581a313a2dbe983a1d985045a Mon Sep 17 00:00:00 2001
|
||
|
From: Kamil Dudka <kdudka@redhat.com>
|
||
|
Date: Sun, 30 Jun 2013 19:51:16 +0200
|
||
|
Subject: [PATCH 16/28] url: restore the functionality of 'curl -u :'
|
||
|
|
||
|
This commit fixes a regression introduced in
|
||
|
fddb7b44a79d78e05043e1c97e069308b6b85f79.
|
||
|
|
||
|
Reported by: Markus Moeller
|
||
|
Bug: http://curl.haxx.se/mail/archive-2013-06/0052.html
|
||
|
|
||
|
Upstream-commit: abca89aaa0fb208cfaf4ead6692014c4e553388a
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 7 +++++++
|
||
|
1 file changed, 7 insertions(+)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index ede7d1c..a2b9abb 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -314,6 +314,13 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp,
|
||
|
if(!result) {
|
||
|
/* Store the username part of option if required */
|
||
|
if(userp) {
|
||
|
+ if(!user && option && option[0] == ':') {
|
||
|
+ /* Allocate an empty string instead of returning NULL as user name */
|
||
|
+ user = strdup("");
|
||
|
+ if(!user)
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ }
|
||
|
+
|
||
|
Curl_safefree(*userp);
|
||
|
*userp = user;
|
||
|
}
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 0df43fcefa7ba9f47e509b4a55edd6b287dd962e Mon Sep 17 00:00:00 2001
|
||
|
From: Yang Tse <yangsita@gmail.com>
|
||
|
Date: Fri, 12 Jul 2013 12:16:48 +0200
|
||
|
Subject: [PATCH 17/28] url.c: fix parse_login_details() OOM handling
|
||
|
|
||
|
Upstream-commit: 83f0dae1292b8b9b2507457db6b3ab22ba31c64b
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 9 +++++++--
|
||
|
1 file changed, 7 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index a2b9abb..61ca8e8 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4474,15 +4474,20 @@ static CURLcode parse_login_details(const char *login, const size_t len,
|
||
|
/* Allocate the password portion buffer */
|
||
|
if(!result && passwdp && plen) {
|
||
|
pbuf = malloc(plen + 1);
|
||
|
- if(!pbuf)
|
||
|
+ if(!pbuf) {
|
||
|
+ Curl_safefree(ubuf);
|
||
|
result = CURLE_OUT_OF_MEMORY;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
/* Allocate the options portion buffer */
|
||
|
if(!result && optionsp && olen) {
|
||
|
obuf = malloc(olen + 1);
|
||
|
- if(!obuf)
|
||
|
+ if(!obuf) {
|
||
|
+ Curl_safefree(pbuf);
|
||
|
+ Curl_safefree(ubuf);
|
||
|
result = CURLE_OUT_OF_MEMORY;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
if(!result) {
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 386bc0349e102cbe9a0417688e15ea7e13cf4dd8 Mon Sep 17 00:00:00 2001
|
||
|
From: Yang Tse <yangsita@gmail.com>
|
||
|
Date: Sun, 14 Jul 2013 12:19:57 +0200
|
||
|
Subject: [PATCH 18/28] url.c: fix parse_url_login() OOM handling
|
||
|
|
||
|
Upstream-commit: cfc907e43d5f25a50a9fae95a37a4c0e959d591a
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 18 +++++++++++++++---
|
||
|
1 file changed, 15 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 61ca8e8..92a126a 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4349,8 +4349,12 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
|
||
|
/* Decode the user */
|
||
|
newname = curl_easy_unescape(data, userp, 0, NULL);
|
||
|
- if(!newname)
|
||
|
+ 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);
|
||
|
@@ -4361,8 +4365,12 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
if(passwdp) {
|
||
|
/* We have a password in the URL so decode it */
|
||
|
char *newpasswd = curl_easy_unescape(data, passwdp, 0, NULL);
|
||
|
- if(!newpasswd)
|
||
|
+ 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);
|
||
|
@@ -4373,8 +4381,12 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
if(optionsp) {
|
||
|
/* We have an options list in the URL so decode it */
|
||
|
char *newoptions = curl_easy_unescape(data, optionsp, 0, NULL);
|
||
|
- if(!newoptions)
|
||
|
+ 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);
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From ca108f78f894fee22eadf46ec6ef4282d1f23949 Mon Sep 17 00:00:00 2001
|
||
|
From: Jonathan Nieder <jrnieder@gmail.com>
|
||
|
Date: Mon, 19 Aug 2013 00:38:08 -0700
|
||
|
Subject: [PATCH 19/28] url: use goto in create_conn() for exception handling
|
||
|
|
||
|
Instead of remembering before each "return" statement which temporary
|
||
|
allocations, if any, need to be freed, take care to set pointers to
|
||
|
NULL when no longer needed and use a goto to a common block to exit
|
||
|
the function and free all temporaries.
|
||
|
|
||
|
No functional change intended. Currently the only temporary buffer in
|
||
|
this function is "proxy" which is already correctly freed when
|
||
|
appropriate, but there will be more soon.
|
||
|
|
||
|
Upstream-commit: 53333a43a1959ddeef27c26f0983be1b81e558bc
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 64 +++++++++++++++++++++++++++++++++++++--------------------------
|
||
|
1 file changed, 38 insertions(+), 26 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 92a126a..105f2fe 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4924,8 +4924,10 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
* Check input data
|
||
|
*************************************************************/
|
||
|
|
||
|
- if(!data->change.url)
|
||
|
- return CURLE_URL_MALFORMAT;
|
||
|
+ if(!data->change.url) {
|
||
|
+ result = CURLE_URL_MALFORMAT;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
|
||
|
/* First, split up the current URL in parts so that we can use the
|
||
|
parts for checking against the already present connections. In order
|
||
|
@@ -4933,8 +4935,10 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
connection data struct and fill in for comparison purposes. */
|
||
|
conn = allocate_conn(data);
|
||
|
|
||
|
- if(!conn)
|
||
|
- return CURLE_OUT_OF_MEMORY;
|
||
|
+ if(!conn) {
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
|
||
|
/* We must set the return variable as soon as possible, so that our
|
||
|
parent can cleanup any possible allocs we may have done before
|
||
|
@@ -4964,15 +4968,18 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
data->state.path = NULL;
|
||
|
|
||
|
data->state.pathbuffer = malloc(urllen+2);
|
||
|
- if(NULL == data->state.pathbuffer)
|
||
|
- return CURLE_OUT_OF_MEMORY; /* really bad error */
|
||
|
+ if(NULL == data->state.pathbuffer) {
|
||
|
+ result = CURLE_OUT_OF_MEMORY; /* really bad error */
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
data->state.path = data->state.pathbuffer;
|
||
|
|
||
|
conn->host.rawalloc = malloc(urllen+2);
|
||
|
if(NULL == conn->host.rawalloc) {
|
||
|
Curl_safefree(data->state.pathbuffer);
|
||
|
data->state.path = NULL;
|
||
|
- return CURLE_OUT_OF_MEMORY;
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ goto out;
|
||
|
}
|
||
|
|
||
|
conn->host.name = conn->host.rawalloc;
|
||
|
@@ -4981,7 +4988,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
result = parseurlandfillconn(data, conn, &prot_missing, user, passwd,
|
||
|
options);
|
||
|
if(result != CURLE_OK)
|
||
|
- return result;
|
||
|
+ goto out;
|
||
|
|
||
|
/*************************************************************
|
||
|
* No protocol part in URL was used, add it!
|
||
|
@@ -4995,8 +5002,8 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
reurl = aprintf("%s://%s", conn->handler->scheme, data->change.url);
|
||
|
|
||
|
if(!reurl) {
|
||
|
- Curl_safefree(proxy);
|
||
|
- return CURLE_OUT_OF_MEMORY;
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ goto out;
|
||
|
}
|
||
|
|
||
|
if(data->change.url_alloc) {
|
||
|
@@ -5033,7 +5040,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
if(conn->bits.proxy_user_passwd) {
|
||
|
result = parse_proxy_auth(data, conn);
|
||
|
if(result != CURLE_OK)
|
||
|
- return result;
|
||
|
+ goto out;
|
||
|
}
|
||
|
|
||
|
/*************************************************************
|
||
|
@@ -5044,7 +5051,8 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
/* if global proxy is set, this is it */
|
||
|
if(NULL == proxy) {
|
||
|
failf(data, "memory shortage");
|
||
|
- return CURLE_OUT_OF_MEMORY;
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ goto out;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@@ -5072,16 +5080,17 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
if(proxy) {
|
||
|
result = parse_proxy(data, conn, proxy);
|
||
|
|
||
|
- free(proxy); /* parse_proxy copies the proxy string */
|
||
|
+ Curl_safefree(proxy); /* parse_proxy copies the proxy string */
|
||
|
|
||
|
if(result)
|
||
|
- return result;
|
||
|
+ goto out;
|
||
|
|
||
|
if((conn->proxytype == CURLPROXY_HTTP) ||
|
||
|
(conn->proxytype == CURLPROXY_HTTP_1_0)) {
|
||
|
#ifdef CURL_DISABLE_HTTP
|
||
|
/* asking for a HTTP proxy is a bit funny when HTTP is disabled... */
|
||
|
- return CURLE_UNSUPPORTED_PROTOCOL;
|
||
|
+ result = CURLE_UNSUPPORTED_PROTOCOL;
|
||
|
+ goto out;
|
||
|
#else
|
||
|
/* force this connection's protocol to become HTTP if not already
|
||
|
compatible - if it isn't tunneling through */
|
||
|
@@ -5111,10 +5120,8 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
* we figured out what/if proxy to use.
|
||
|
*************************************************************/
|
||
|
result = setup_connection_internals(conn);
|
||
|
- if(result != CURLE_OK) {
|
||
|
- Curl_safefree(proxy);
|
||
|
- return result;
|
||
|
- }
|
||
|
+ if(result != CURLE_OK)
|
||
|
+ goto out;
|
||
|
|
||
|
conn->recv[FIRSTSOCKET] = Curl_recv_plain;
|
||
|
conn->send[FIRSTSOCKET] = Curl_send_plain;
|
||
|
@@ -5147,7 +5154,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
DEBUGASSERT(conn->handler->done);
|
||
|
/* we ignore the return code for the protocol-specific DONE */
|
||
|
(void)conn->handler->done(conn, result, FALSE);
|
||
|
- return result;
|
||
|
+ goto out;
|
||
|
}
|
||
|
|
||
|
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, /* no download */
|
||
|
@@ -5157,7 +5164,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
/* since we skip do_init() */
|
||
|
Curl_speedinit(data);
|
||
|
|
||
|
- return result;
|
||
|
+ goto out;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
@@ -5173,13 +5180,13 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
*************************************************************/
|
||
|
result = parse_remote_port(data, conn);
|
||
|
if(result != CURLE_OK)
|
||
|
- return result;
|
||
|
+ goto out;
|
||
|
|
||
|
/* Check for overridden login details and set them accordingly */
|
||
|
override_login(data, conn, user, passwd, options);
|
||
|
result = set_login(conn, user, passwd, options);
|
||
|
if(result != CURLE_OK)
|
||
|
- return result;
|
||
|
+ goto out;
|
||
|
|
||
|
/* Get a cloned copy of the SSL config situation stored in the
|
||
|
connection struct. But to get this going nicely, we must first make
|
||
|
@@ -5202,8 +5209,10 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
data->set.ssl.password = data->set.str[STRING_TLSAUTH_PASSWORD];
|
||
|
#endif
|
||
|
|
||
|
- if(!Curl_clone_ssl_config(&data->set.ssl, &conn->ssl_config))
|
||
|
- return CURLE_OUT_OF_MEMORY;
|
||
|
+ if(!Curl_clone_ssl_config(&data->set.ssl, &conn->ssl_config)) {
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
|
||
|
/*************************************************************
|
||
|
* Check the current list of connections to see if we can
|
||
|
@@ -5256,7 +5265,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
*/
|
||
|
result = setup_range(data);
|
||
|
if(result)
|
||
|
- return result;
|
||
|
+ goto out;
|
||
|
|
||
|
/* Continue connectdata initialization here. */
|
||
|
|
||
|
@@ -5274,6 +5283,9 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
*************************************************************/
|
||
|
result = resolve_server(data, conn, async);
|
||
|
|
||
|
+ out:
|
||
|
+
|
||
|
+ Curl_safefree(proxy);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 2f81fdaa7a966ba8e0bfaae29d86426b7e8159bd Mon Sep 17 00:00:00 2001
|
||
|
From: Jonathan Nieder <jrnieder@gmail.com>
|
||
|
Date: Mon, 19 Aug 2013 00:39:05 -0700
|
||
|
Subject: [PATCH 20/28] url: allocate username, password, and options on the
|
||
|
heap
|
||
|
|
||
|
This makes it possible to increase the size of the buffers when needed
|
||
|
in later patches. No functional change yet.
|
||
|
|
||
|
Upstream-commit: 11baffbff67eae225f63fc684d80ce52a79c8ac5
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 17 ++++++++++++++---
|
||
|
1 file changed, 14 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 105f2fe..6bce0bb 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4911,9 +4911,9 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
struct connectdata *conn;
|
||
|
struct connectdata *conn_temp = NULL;
|
||
|
size_t urllen;
|
||
|
- char user[MAX_CURL_USER_LENGTH];
|
||
|
- char passwd[MAX_CURL_PASSWORD_LENGTH];
|
||
|
- char options[MAX_CURL_OPTIONS_LENGTH];
|
||
|
+ char *user = NULL;
|
||
|
+ char *passwd = NULL;
|
||
|
+ char *options = NULL;
|
||
|
bool reuse;
|
||
|
char *proxy = NULL;
|
||
|
bool prot_missing = FALSE;
|
||
|
@@ -4985,6 +4985,14 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
conn->host.name = conn->host.rawalloc;
|
||
|
conn->host.name[0] = 0;
|
||
|
|
||
|
+ user = malloc(MAX_CURL_USER_LENGTH);
|
||
|
+ passwd = malloc(MAX_CURL_PASSWORD_LENGTH);
|
||
|
+ options = malloc(MAX_CURL_OPTIONS_LENGTH);
|
||
|
+ if(!user || !passwd || !options) {
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+
|
||
|
result = parseurlandfillconn(data, conn, &prot_missing, user, passwd,
|
||
|
options);
|
||
|
if(result != CURLE_OK)
|
||
|
@@ -5285,6 +5293,9 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
|
||
|
out:
|
||
|
|
||
|
+ Curl_safefree(options);
|
||
|
+ Curl_safefree(passwd);
|
||
|
+ Curl_safefree(user);
|
||
|
Curl_safefree(proxy);
|
||
|
return result;
|
||
|
}
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 978711e025bcbd1654758b648db4317d0e446f84 Mon Sep 17 00:00:00 2001
|
||
|
From: Jonathan Nieder <jrnieder@gmail.com>
|
||
|
Date: Mon, 19 Aug 2013 00:48:24 -0700
|
||
|
Subject: [PATCH 21/28] netrc: handle longer username and password
|
||
|
|
||
|
libcurl truncates usernames and passwords it reads from .netrc to
|
||
|
LOGINSIZE and PASSWORDSIZE (64) characters without any indication to
|
||
|
the user, to ensure the values returned from Curl_parsenetrc fit in a
|
||
|
caller-provided buffer.
|
||
|
|
||
|
Fix the interface by passing back dynamically allocated buffers
|
||
|
allocated to fit the user's input. The parser still relies on a
|
||
|
256-character buffer to read each line, though.
|
||
|
|
||
|
So now you can include an ~246-character password in your .netrc,
|
||
|
instead of the previous limit of 63 characters.
|
||
|
|
||
|
Reported-by: Colby Ranger
|
||
|
|
||
|
Upstream-commit: 36585b539543ca4471ab19c0d738a6e52a827aee
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/netrc.c | 20 ++++++++++++-------
|
||
|
lib/netrc.h | 16 ++++++----------
|
||
|
lib/url.c | 18 ++++++++---------
|
||
|
tests/unit/unit1304.c | 53 ++++++++++++++++++++++++++++++---------------------
|
||
|
4 files changed, 59 insertions(+), 48 deletions(-)
|
||
|
|
||
|
diff --git a/lib/netrc.c b/lib/netrc.c
|
||
|
index 2c5942a..f51fdf3 100644
|
||
|
--- a/lib/netrc.c
|
||
|
+++ b/lib/netrc.c
|
||
|
@@ -52,13 +52,13 @@ enum host_lookup_state {
|
||
|
* @unittest: 1304
|
||
|
*/
|
||
|
int Curl_parsenetrc(const char *host,
|
||
|
- char *login,
|
||
|
- char *password,
|
||
|
+ char **loginp,
|
||
|
+ char **passwordp,
|
||
|
char *netrcfile)
|
||
|
{
|
||
|
FILE *file;
|
||
|
int retcode=1;
|
||
|
- int specific_login = (login[0] != 0);
|
||
|
+ int specific_login = (**loginp != 0);
|
||
|
char *home = NULL;
|
||
|
bool home_alloc = FALSE;
|
||
|
bool netrc_alloc = FALSE;
|
||
|
@@ -109,7 +109,7 @@ int Curl_parsenetrc(const char *host,
|
||
|
tok=strtok_r(netrcbuffer, " \t\n", &tok_buf);
|
||
|
while(!done && tok) {
|
||
|
|
||
|
- if(login[0] && password[0]) {
|
||
|
+ if(**loginp && **passwordp) {
|
||
|
done=TRUE;
|
||
|
break;
|
||
|
}
|
||
|
@@ -138,16 +138,22 @@ int Curl_parsenetrc(const char *host,
|
||
|
/* we are now parsing sub-keywords concerning "our" host */
|
||
|
if(state_login) {
|
||
|
if(specific_login) {
|
||
|
- state_our_login = Curl_raw_equal(login, tok);
|
||
|
+ state_our_login = Curl_raw_equal(*loginp, tok);
|
||
|
}
|
||
|
else {
|
||
|
- strncpy(login, tok, LOGINSIZE-1);
|
||
|
+ free(*loginp);
|
||
|
+ *loginp = strdup(tok);
|
||
|
+ if(!*loginp)
|
||
|
+ return -1; /* allocation failed */
|
||
|
}
|
||
|
state_login=0;
|
||
|
}
|
||
|
else if(state_password) {
|
||
|
if(state_our_login || !specific_login) {
|
||
|
- strncpy(password, tok, PASSWORDSIZE-1);
|
||
|
+ free(*passwordp);
|
||
|
+ *passwordp = strdup(tok);
|
||
|
+ if(!*passwordp)
|
||
|
+ return -1; /* allocation failed */
|
||
|
}
|
||
|
state_password=0;
|
||
|
}
|
||
|
diff --git a/lib/netrc.h b/lib/netrc.h
|
||
|
index 4db764d..a145601 100644
|
||
|
--- a/lib/netrc.h
|
||
|
+++ b/lib/netrc.h
|
||
|
@@ -22,19 +22,15 @@
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
|
||
|
-/* Make sure we have room for at least this size: */
|
||
|
-#define LOGINSIZE 64
|
||
|
-#define PASSWORDSIZE 64
|
||
|
-
|
||
|
/* returns -1 on failure, 0 if the host is found, 1 is the host isn't found */
|
||
|
int Curl_parsenetrc(const char *host,
|
||
|
- char *login,
|
||
|
- char *password,
|
||
|
+ char **loginp,
|
||
|
+ char **passwordp,
|
||
|
char *filename);
|
||
|
- /* Assume: password[0]=0, host[0] != 0.
|
||
|
- * If login[0] = 0, search for login and password within a machine section
|
||
|
- * in the netrc.
|
||
|
- * If login[0] != 0, search for password within machine and login.
|
||
|
+ /* Assume: (*passwordp)[0]=0, host[0] != 0.
|
||
|
+ * If (*loginp)[0] = 0, search for login and password within a machine
|
||
|
+ * section in the netrc.
|
||
|
+ * If (*loginp)[0] != 0, search for password within machine and login.
|
||
|
*/
|
||
|
|
||
|
#endif /* HEADER_CURL_NETRC_H */
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 6bce0bb..406ef85 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4656,27 +4656,27 @@ static CURLcode parse_remote_port(struct SessionHandle *data,
|
||
|
*/
|
||
|
static void override_login(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
- char *user, char *passwd, char *options)
|
||
|
+ char **userp, char **passwdp, char **optionsp)
|
||
|
{
|
||
|
if(data->set.str[STRING_USERNAME]) {
|
||
|
- strncpy(user, data->set.str[STRING_USERNAME], MAX_CURL_USER_LENGTH);
|
||
|
- user[MAX_CURL_USER_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
+ strncpy(*userp, data->set.str[STRING_USERNAME], MAX_CURL_USER_LENGTH);
|
||
|
+ (*userp)[MAX_CURL_USER_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
}
|
||
|
|
||
|
if(data->set.str[STRING_PASSWORD]) {
|
||
|
- strncpy(passwd, data->set.str[STRING_PASSWORD], MAX_CURL_PASSWORD_LENGTH);
|
||
|
- passwd[MAX_CURL_PASSWORD_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
+ strncpy(*passwdp, data->set.str[STRING_PASSWORD], MAX_CURL_PASSWORD_LENGTH);
|
||
|
+ (*passwdp)[MAX_CURL_PASSWORD_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
}
|
||
|
|
||
|
if(data->set.str[STRING_OPTIONS]) {
|
||
|
- strncpy(options, data->set.str[STRING_OPTIONS], MAX_CURL_OPTIONS_LENGTH);
|
||
|
- options[MAX_CURL_OPTIONS_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
+ strncpy(*optionsp, data->set.str[STRING_OPTIONS], MAX_CURL_OPTIONS_LENGTH);
|
||
|
+ (*optionsp)[MAX_CURL_OPTIONS_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
}
|
||
|
|
||
|
conn->bits.netrc = FALSE;
|
||
|
if(data->set.use_netrc != CURL_NETRC_IGNORED) {
|
||
|
if(Curl_parsenetrc(conn->host.name,
|
||
|
- user, passwd,
|
||
|
+ userp, passwdp,
|
||
|
data->set.str[STRING_NETRC_FILE])) {
|
||
|
infof(data, "Couldn't find host %s in the "
|
||
|
DOT_CHAR "netrc file; using defaults\n",
|
||
|
@@ -5191,7 +5191,7 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
goto out;
|
||
|
|
||
|
/* Check for overridden login details and set them accordingly */
|
||
|
- override_login(data, conn, user, passwd, options);
|
||
|
+ override_login(data, conn, &user, &passwd, &options);
|
||
|
result = set_login(conn, user, passwd, options);
|
||
|
if(result != CURLE_OK)
|
||
|
goto out;
|
||
|
diff --git a/tests/unit/unit1304.c b/tests/unit/unit1304.c
|
||
|
index 8ddd8ca..9242e80 100644
|
||
|
--- a/tests/unit/unit1304.c
|
||
|
+++ b/tests/unit/unit1304.c
|
||
|
@@ -23,14 +23,14 @@
|
||
|
|
||
|
#include "netrc.h"
|
||
|
|
||
|
-static char login[LOGINSIZE];
|
||
|
-static char password[PASSWORDSIZE];
|
||
|
+static char *login;
|
||
|
+static char *password;
|
||
|
static char filename[64];
|
||
|
|
||
|
static CURLcode unit_setup(void)
|
||
|
{
|
||
|
- password[0] = 0;
|
||
|
- login[0] = 0;
|
||
|
+ password = strdup("");
|
||
|
+ login = strdup("");
|
||
|
return CURLE_OK;
|
||
|
}
|
||
|
|
||
|
@@ -47,7 +47,7 @@ UNITTEST_START
|
||
|
/*
|
||
|
* Test a non existent host in our netrc file.
|
||
|
*/
|
||
|
- result = Curl_parsenetrc("test.example.com", login, password, filename);
|
||
|
+ result = Curl_parsenetrc("test.example.com", &login, &password, filename);
|
||
|
fail_unless(result == 1, "Host not found should return 1");
|
||
|
fail_unless(password[0] == 0, "password should not have been changed");
|
||
|
fail_unless(login[0] == 0, "login should not have been changed");
|
||
|
@@ -55,8 +55,9 @@ UNITTEST_START
|
||
|
/*
|
||
|
* Test a non existent login in our netrc file.
|
||
|
*/
|
||
|
- memcpy(login, "me", 2);
|
||
|
- result = Curl_parsenetrc("example.com", login, password, filename);
|
||
|
+ free(login);
|
||
|
+ login = strdup("me");
|
||
|
+ result = Curl_parsenetrc("example.com", &login, &password, filename);
|
||
|
fail_unless(result == 0, "Host should be found");
|
||
|
fail_unless(password[0] == 0, "password should not have been changed");
|
||
|
fail_unless(strncmp(login, "me", 2) == 0, "login should not have been changed");
|
||
|
@@ -64,8 +65,9 @@ UNITTEST_START
|
||
|
/*
|
||
|
* Test a non existent login and host in our netrc file.
|
||
|
*/
|
||
|
- memcpy(login, "me", 2);
|
||
|
- result = Curl_parsenetrc("test.example.com", login, password, filename);
|
||
|
+ free(login);
|
||
|
+ login = strdup("me");
|
||
|
+ result = Curl_parsenetrc("test.example.com", &login, &password, filename);
|
||
|
fail_unless(result == 1, "Host should be found");
|
||
|
fail_unless(password[0] == 0, "password should not have been changed");
|
||
|
fail_unless(strncmp(login, "me", 2) == 0, "login should not have been changed");
|
||
|
@@ -74,8 +76,9 @@ UNITTEST_START
|
||
|
* Test a non existent login (substring of an existing one) in our
|
||
|
* netrc file.
|
||
|
*/
|
||
|
- memcpy(login, "admi", 4);
|
||
|
- result = Curl_parsenetrc("example.com", login, password, filename);
|
||
|
+ free(login);
|
||
|
+ login = strdup("admi");
|
||
|
+ result = Curl_parsenetrc("example.com", &login, &password, filename);
|
||
|
fail_unless(result == 0, "Host should be found");
|
||
|
fail_unless(password[0] == 0, "password should not have been changed");
|
||
|
fail_unless(strncmp(login, "admi", 4) == 0, "login should not have been changed");
|
||
|
@@ -84,8 +87,9 @@ UNITTEST_START
|
||
|
* Test a non existent login (superstring of an existing one)
|
||
|
* in our netrc file.
|
||
|
*/
|
||
|
- memcpy(login, "adminn", 6);
|
||
|
- result = Curl_parsenetrc("example.com", login, password, filename);
|
||
|
+ free(login);
|
||
|
+ login = strdup("adminn");
|
||
|
+ result = Curl_parsenetrc("example.com", &login, &password, filename);
|
||
|
fail_unless(result == 0, "Host should be found");
|
||
|
fail_unless(password[0] == 0, "password should not have been changed");
|
||
|
fail_unless(strncmp(login, "adminn", 6) == 0, "login should not have been changed");
|
||
|
@@ -94,8 +98,9 @@ UNITTEST_START
|
||
|
* Test for the first existing host in our netrc file
|
||
|
* with login[0] = 0.
|
||
|
*/
|
||
|
- login[0] = 0;
|
||
|
- result = Curl_parsenetrc("example.com", login, password, filename);
|
||
|
+ free(login);
|
||
|
+ login = strdup("");
|
||
|
+ result = Curl_parsenetrc("example.com", &login, &password, filename);
|
||
|
fail_unless(result == 0, "Host should have been found");
|
||
|
fail_unless(strncmp(password, "passwd", 6) == 0,
|
||
|
"password should be 'passwd'");
|
||
|
@@ -105,8 +110,9 @@ UNITTEST_START
|
||
|
* Test for the first existing host in our netrc file
|
||
|
* with login[0] != 0.
|
||
|
*/
|
||
|
- password[0] = 0;
|
||
|
- result = Curl_parsenetrc("example.com", login, password, filename);
|
||
|
+ free(password);
|
||
|
+ password = strdup("");
|
||
|
+ result = Curl_parsenetrc("example.com", &login, &password, filename);
|
||
|
fail_unless(result == 0, "Host should have been found");
|
||
|
fail_unless(strncmp(password, "passwd", 6) == 0,
|
||
|
"password should be 'passwd'");
|
||
|
@@ -116,9 +122,11 @@ UNITTEST_START
|
||
|
* Test for the second existing host in our netrc file
|
||
|
* with login[0] = 0.
|
||
|
*/
|
||
|
- password[0] = 0;
|
||
|
- login[0] = 0;
|
||
|
- result = Curl_parsenetrc("curl.example.com", login, password, filename);
|
||
|
+ free(password);
|
||
|
+ password = strdup("");
|
||
|
+ free(login);
|
||
|
+ login = strdup("");
|
||
|
+ result = Curl_parsenetrc("curl.example.com", &login, &password, filename);
|
||
|
fail_unless(result == 0, "Host should have been found");
|
||
|
fail_unless(strncmp(password, "none", 4) == 0,
|
||
|
"password should be 'none'");
|
||
|
@@ -128,8 +136,9 @@ UNITTEST_START
|
||
|
* Test for the second existing host in our netrc file
|
||
|
* with login[0] != 0.
|
||
|
*/
|
||
|
- password[0] = 0;
|
||
|
- result = Curl_parsenetrc("curl.example.com", login, password, filename);
|
||
|
+ free(password);
|
||
|
+ password = strdup("");
|
||
|
+ result = Curl_parsenetrc("curl.example.com", &login, &password, filename);
|
||
|
fail_unless(result == 0, "Host should have been found");
|
||
|
fail_unless(strncmp(password, "none", 4) == 0,
|
||
|
"password should be 'none'");
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 96b625ddedb692a41b173cabf0bd5913f4535c70 Mon Sep 17 00:00:00 2001
|
||
|
From: Jonathan Nieder <jrnieder@gmail.com>
|
||
|
Date: Mon, 19 Aug 2013 00:57:54 -0700
|
||
|
Subject: [PATCH 22/28] Curl_setopt: handle arbitrary-length username and
|
||
|
password
|
||
|
|
||
|
libcurl truncates usernames, passwords, and options set with
|
||
|
curl_easy_setopt to 255 (= MAX_CURL_PASSWORD_LENGTH - 1) characters.
|
||
|
This doesn't affect the return value from curl_easy_setopt(), so from
|
||
|
the caller's point of view, there is no sign anything strange has
|
||
|
happened, except that authentication fails.
|
||
|
|
||
|
For example:
|
||
|
|
||
|
# Prepare a long (300-char) password.
|
||
|
s=0123456789; s=$s$s$s$s$s$s$s$s$s$s; s=$s$s$s;
|
||
|
# Start a server.
|
||
|
nc -l -p 8888 | tee out & pid=$!
|
||
|
# Tell curl to pass the password to the server.
|
||
|
curl --user me:$s http://localhost:8888 & sleep 1; kill $pid
|
||
|
# Extract the password.
|
||
|
userpass=$(
|
||
|
awk '/Authorization: Basic/ {print $3}' <out |
|
||
|
tr -d '\r' |
|
||
|
base64 -d
|
||
|
)
|
||
|
password=${userpass#me:}
|
||
|
echo ${#password}
|
||
|
|
||
|
Expected result: 300
|
||
|
Actual result: 255
|
||
|
|
||
|
The fix is simple: allocate appropriately sized buffers on the heap
|
||
|
instead of trying to squeeze the provided values into fixed-size
|
||
|
on-stack buffers.
|
||
|
|
||
|
Bug: http://bugs.debian.org/719856
|
||
|
Reported-by: Colby Ranger
|
||
|
|
||
|
Upstream-commit: 15f76bf7bb92b315799541b0e5127c8d22a50733
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 29 +++++++++++++++++++----------
|
||
|
1 file changed, 19 insertions(+), 10 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 406ef85..515fa67 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4654,23 +4654,29 @@ static CURLcode parse_remote_port(struct SessionHandle *data,
|
||
|
* Override the login details from the URL with that in the CURLOPT_USERPWD
|
||
|
* option or a .netrc file, if applicable.
|
||
|
*/
|
||
|
-static void override_login(struct SessionHandle *data,
|
||
|
- struct connectdata *conn,
|
||
|
- char **userp, char **passwdp, char **optionsp)
|
||
|
+static int override_login(struct SessionHandle *data,
|
||
|
+ struct connectdata *conn,
|
||
|
+ char **userp, char **passwdp, char **optionsp)
|
||
|
{
|
||
|
if(data->set.str[STRING_USERNAME]) {
|
||
|
- strncpy(*userp, data->set.str[STRING_USERNAME], MAX_CURL_USER_LENGTH);
|
||
|
- (*userp)[MAX_CURL_USER_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
+ free(*userp);
|
||
|
+ *userp = strdup(data->set.str[STRING_USERNAME]);
|
||
|
+ if(!*userp)
|
||
|
+ return CURLE_OUT_OF_MEMORY;
|
||
|
}
|
||
|
|
||
|
if(data->set.str[STRING_PASSWORD]) {
|
||
|
- strncpy(*passwdp, data->set.str[STRING_PASSWORD], MAX_CURL_PASSWORD_LENGTH);
|
||
|
- (*passwdp)[MAX_CURL_PASSWORD_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
+ free(*passwdp);
|
||
|
+ *passwdp = strdup(data->set.str[STRING_PASSWORD]);
|
||
|
+ if(!*passwdp)
|
||
|
+ return CURLE_OUT_OF_MEMORY;
|
||
|
}
|
||
|
|
||
|
if(data->set.str[STRING_OPTIONS]) {
|
||
|
- strncpy(*optionsp, data->set.str[STRING_OPTIONS], MAX_CURL_OPTIONS_LENGTH);
|
||
|
- (*optionsp)[MAX_CURL_OPTIONS_LENGTH - 1] = '\0'; /* To be on safe side */
|
||
|
+ free(*optionsp);
|
||
|
+ *optionsp = strdup(data->set.str[STRING_OPTIONS]);
|
||
|
+ if(!*optionsp)
|
||
|
+ return CURLE_OUT_OF_MEMORY;
|
||
|
}
|
||
|
|
||
|
conn->bits.netrc = FALSE;
|
||
|
@@ -4691,6 +4697,7 @@ static void override_login(struct SessionHandle *data,
|
||
|
conn->bits.user_passwd = TRUE; /* enable user+password */
|
||
|
}
|
||
|
}
|
||
|
+ return CURLE_OK;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
@@ -5191,7 +5198,9 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
goto out;
|
||
|
|
||
|
/* Check for overridden login details and set them accordingly */
|
||
|
- override_login(data, conn, &user, &passwd, &options);
|
||
|
+ result = override_login(data, conn, &user, &passwd, &options);
|
||
|
+ if(result != CURLE_OK)
|
||
|
+ goto out;
|
||
|
result = set_login(conn, user, passwd, options);
|
||
|
if(result != CURLE_OK)
|
||
|
goto out;
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From d2fa706f006d393eee63ed686efccf68db5b6337 Mon Sep 17 00:00:00 2001
|
||
|
From: Jonathan Nieder <jrnieder@gmail.com>
|
||
|
Date: Mon, 19 Aug 2013 01:01:26 -0700
|
||
|
Subject: [PATCH 23/28] url: handle exceptional cases first in
|
||
|
parse_url_login()
|
||
|
|
||
|
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.
|
||
|
|
||
|
Upstream-commit: 09ddb1d61cdb9ee11ebf481b29dac1be8f0ab848
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 121 ++++++++++++++++++++++++++++++--------------------------------
|
||
|
1 file changed, 59 insertions(+), 62 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 515fa67..8fff5ef 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4321,86 +4321,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;
|
||
|
|
||
|
- 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 :-(
|
||
|
+ */
|
||
|
|
||
|
- /* 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;
|
||
|
|
||
|
- 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;
|
||
|
- }
|
||
|
+ /* 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(strlen(newname) < MAX_CURL_USER_LENGTH)
|
||
|
- strcpy(user, newname);
|
||
|
+ if(userp) {
|
||
|
+ char *newname;
|
||
|
|
||
|
- free(newname);
|
||
|
- }
|
||
|
+ /* We have a user in the URL */
|
||
|
+ conn->bits.userpwd_in_url = TRUE;
|
||
|
+ conn->bits.user_passwd = TRUE; /* enable user+password */
|
||
|
|
||
|
- 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;
|
||
|
- }
|
||
|
+ /* Decode the user */
|
||
|
+ newname = curl_easy_unescape(data, userp, 0, NULL);
|
||
|
+ if(!newname) {
|
||
|
+ result = CURLE_OUT_OF_MEMORY;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
|
||
|
- if(strlen(newpasswd) < MAX_CURL_PASSWORD_LENGTH)
|
||
|
- strcpy(passwd, newpasswd);
|
||
|
+ if(strlen(newname) < MAX_CURL_USER_LENGTH)
|
||
|
+ strcpy(user, newname);
|
||
|
|
||
|
- free(newpasswd);
|
||
|
- }
|
||
|
+ free(newname);
|
||
|
+ }
|
||
|
|
||
|
- 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(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(newoptions) < MAX_CURL_OPTIONS_LENGTH)
|
||
|
- strcpy(options, newoptions);
|
||
|
+ if(strlen(newpasswd) < MAX_CURL_PASSWORD_LENGTH)
|
||
|
+ strcpy(passwd, newpasswd);
|
||
|
|
||
|
- free(newoptions);
|
||
|
- }
|
||
|
- }
|
||
|
+ free(newpasswd);
|
||
|
+ }
|
||
|
|
||
|
- Curl_safefree(userp);
|
||
|
- Curl_safefree(passwdp);
|
||
|
- Curl_safefree(optionsp);
|
||
|
+ 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;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 085588f8f1baa68a28e0cc3b7197fcb3f99b8f15 Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sun, 21 Apr 2013 12:11:50 +0100
|
||
|
Subject: [PATCH 24/28] url: Removed unused text length constants
|
||
|
|
||
|
Upstream-commit: 455ba691a7250b312075a5d91ae89bbbe70d62aa
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/urldata.h | 3 ---
|
||
|
1 file changed, 3 deletions(-)
|
||
|
|
||
|
diff --git a/lib/urldata.h b/lib/urldata.h
|
||
|
index 1c2281a..219a11a 100644
|
||
|
--- a/lib/urldata.h
|
||
|
+++ b/lib/urldata.h
|
||
|
@@ -1134,9 +1134,6 @@ typedef enum {
|
||
|
#define MAX_CURL_USER_LENGTH 256
|
||
|
#define MAX_CURL_PASSWORD_LENGTH 256
|
||
|
#define MAX_CURL_OPTIONS_LENGTH 256
|
||
|
-#define MAX_CURL_USER_LENGTH_TXT "255"
|
||
|
-#define MAX_CURL_PASSWORD_LENGTH_TXT "255"
|
||
|
-#define MAX_CURL_OPTIONS_LENGTH_TXT "255"
|
||
|
|
||
|
struct auth {
|
||
|
unsigned long want; /* Bitmask set to the authentication methods wanted by
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 314f6398307783780f416d834295002c4b745251 Mon Sep 17 00:00:00 2001
|
||
|
From: Jonathan Nieder <jrnieder@gmail.com>
|
||
|
Date: Mon, 19 Aug 2013 01:36:46 -0700
|
||
|
Subject: [PATCH 25/28] url: handle arbitrary-length username and password
|
||
|
before '@'
|
||
|
|
||
|
libcurl quietly truncates usernames, passwords, and options from
|
||
|
before an '@' sign in a URL to 255 (= MAX_CURL_PASSWORD_LENGTH - 1)
|
||
|
characters to fit in fixed-size buffers on the stack. Allocate a
|
||
|
buffer large enough to fit the parsed fields on the fly instead to
|
||
|
support longer passwords.
|
||
|
|
||
|
After this change, there are no more uses of MAX_CURL_OPTIONS_LENGTH
|
||
|
left, so stop defining that constant while at it. The hardcoded max
|
||
|
username and password length constants, on the other hand, are still
|
||
|
used in HTTP proxy credential handling (which this patch doesn't
|
||
|
touch).
|
||
|
|
||
|
Reported-by: Colby Ranger
|
||
|
|
||
|
Upstream-commit: 2f1a0bc0bf36c5ad0f8755d9c7553e1f5729af43
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 45 +++++++++++++++++++++------------------------
|
||
|
lib/urldata.h | 1 -
|
||
|
2 files changed, 21 insertions(+), 25 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 8fff5ef..abf8a43 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -140,7 +140,8 @@ static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke);
|
||
|
static CURLcode do_init(struct connectdata *conn);
|
||
|
static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
- char *user, char *passwd, char *options);
|
||
|
+ char **userptr, char **passwdptr,
|
||
|
+ char **optionsptr);
|
||
|
static CURLcode parse_login_details(const char *login, const size_t len,
|
||
|
char **userptr, char **passwdptr,
|
||
|
char **optionsptr);
|
||
|
@@ -3595,7 +3596,8 @@ static CURLcode findprotocol(struct SessionHandle *data,
|
||
|
static CURLcode parseurlandfillconn(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
bool *prot_missing,
|
||
|
- char *user, char *passwd, char *options)
|
||
|
+ char **userp, char **passwdp,
|
||
|
+ char **optionsp)
|
||
|
{
|
||
|
char *at;
|
||
|
char *fragment;
|
||
|
@@ -3820,7 +3822,7 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
|
||
|
* Parse the login details from the URL and strip them out of
|
||
|
* the host name
|
||
|
*/
|
||
|
- result = parse_url_login(data, conn, user, passwd, options);
|
||
|
+ result = parse_url_login(data, conn, userp, passwdp, optionsp);
|
||
|
if(result != CURLE_OK)
|
||
|
return result;
|
||
|
|
||
|
@@ -4300,7 +4302,7 @@ static CURLcode parse_proxy_auth(struct SessionHandle *data,
|
||
|
*/
|
||
|
static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
struct connectdata *conn,
|
||
|
- char *user, char *passwd, char *options)
|
||
|
+ char **user, char **passwd, char **options)
|
||
|
{
|
||
|
CURLcode result = CURLE_OK;
|
||
|
char *userp = NULL;
|
||
|
@@ -4317,9 +4319,9 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
char *ptr = strchr(conn->host.name, '@');
|
||
|
char *login = conn->host.name;
|
||
|
|
||
|
- user[0] = 0; /* to make everything well-defined */
|
||
|
- passwd[0] = 0;
|
||
|
- options[0] = 0;
|
||
|
+ DEBUGASSERT(!**user);
|
||
|
+ DEBUGASSERT(!**passwd);
|
||
|
+ DEBUGASSERT(!**options);
|
||
|
|
||
|
if(!ptr)
|
||
|
goto out;
|
||
|
@@ -4358,10 +4360,8 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
- if(strlen(newname) < MAX_CURL_USER_LENGTH)
|
||
|
- strcpy(user, newname);
|
||
|
-
|
||
|
- free(newname);
|
||
|
+ free(*user);
|
||
|
+ *user = newname;
|
||
|
}
|
||
|
|
||
|
if(passwdp) {
|
||
|
@@ -4372,10 +4372,8 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
- if(strlen(newpasswd) < MAX_CURL_PASSWORD_LENGTH)
|
||
|
- strcpy(passwd, newpasswd);
|
||
|
-
|
||
|
- free(newpasswd);
|
||
|
+ free(*passwd);
|
||
|
+ *passwd = newpasswd;
|
||
|
}
|
||
|
|
||
|
if(optionsp) {
|
||
|
@@ -4386,12 +4384,11 @@ static CURLcode parse_url_login(struct SessionHandle *data,
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
- if(strlen(newoptions) < MAX_CURL_OPTIONS_LENGTH)
|
||
|
- strcpy(options, newoptions);
|
||
|
-
|
||
|
- free(newoptions);
|
||
|
+ free(*options);
|
||
|
+ *options = newoptions;
|
||
|
}
|
||
|
|
||
|
+
|
||
|
out:
|
||
|
|
||
|
Curl_safefree(userp);
|
||
|
@@ -4989,16 +4986,16 @@ static CURLcode create_conn(struct SessionHandle *data,
|
||
|
conn->host.name = conn->host.rawalloc;
|
||
|
conn->host.name[0] = 0;
|
||
|
|
||
|
- user = malloc(MAX_CURL_USER_LENGTH);
|
||
|
- passwd = malloc(MAX_CURL_PASSWORD_LENGTH);
|
||
|
- options = malloc(MAX_CURL_OPTIONS_LENGTH);
|
||
|
+ user = strdup("");
|
||
|
+ passwd = strdup("");
|
||
|
+ options = strdup("");
|
||
|
if(!user || !passwd || !options) {
|
||
|
result = CURLE_OUT_OF_MEMORY;
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
- result = parseurlandfillconn(data, conn, &prot_missing, user, passwd,
|
||
|
- options);
|
||
|
+ result = parseurlandfillconn(data, conn, &prot_missing, &user, &passwd,
|
||
|
+ &options);
|
||
|
if(result != CURLE_OK)
|
||
|
goto out;
|
||
|
|
||
|
diff --git a/lib/urldata.h b/lib/urldata.h
|
||
|
index 219a11a..b3ee7e3 100644
|
||
|
--- a/lib/urldata.h
|
||
|
+++ b/lib/urldata.h
|
||
|
@@ -1133,7 +1133,6 @@ typedef enum {
|
||
|
* Session-data MUST be put in the connectdata struct and here. */
|
||
|
#define MAX_CURL_USER_LENGTH 256
|
||
|
#define MAX_CURL_PASSWORD_LENGTH 256
|
||
|
-#define MAX_CURL_OPTIONS_LENGTH 256
|
||
|
|
||
|
struct auth {
|
||
|
unsigned long want; /* Bitmask set to the authentication methods wanted by
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 806203027b9dae8992f9762b056e953ecb118b84 Mon Sep 17 00:00:00 2001
|
||
|
From: Steve Holme <steve_holme@hotmail.com>
|
||
|
Date: Sun, 1 Sep 2013 13:30:12 +0100
|
||
|
Subject: [PATCH 26/28] url.c: Fixed compilation warning
|
||
|
|
||
|
An enumerated type is mixed with another type
|
||
|
|
||
|
Upstream-commit: 322f0bc2f1af4a985e85ee5c8639e3b454314ccd
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 7 ++++---
|
||
|
1 file changed, 4 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index abf8a43..558799c 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4648,9 +4648,9 @@ static CURLcode parse_remote_port(struct SessionHandle *data,
|
||
|
* Override the login details from the URL with that in the CURLOPT_USERPWD
|
||
|
* option or a .netrc file, if applicable.
|
||
|
*/
|
||
|
-static int override_login(struct SessionHandle *data,
|
||
|
- struct connectdata *conn,
|
||
|
- char **userp, char **passwdp, char **optionsp)
|
||
|
+static CURLcode override_login(struct SessionHandle *data,
|
||
|
+ struct connectdata *conn,
|
||
|
+ char **userp, char **passwdp, char **optionsp)
|
||
|
{
|
||
|
if(data->set.str[STRING_USERNAME]) {
|
||
|
free(*userp);
|
||
|
@@ -4691,6 +4691,7 @@ static int override_login(struct SessionHandle *data,
|
||
|
conn->bits.user_passwd = TRUE; /* enable user+password */
|
||
|
}
|
||
|
}
|
||
|
+
|
||
|
return CURLE_OK;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From 7ed75f9bce576390e2c94a797c4520130654b416 Mon Sep 17 00:00:00 2001
|
||
|
From: Daniel Stenberg <daniel@haxx.se>
|
||
|
Date: Sat, 14 Dec 2013 22:39:27 +0100
|
||
|
Subject: [PATCH 27/28] login options: remove the ;[options] support from
|
||
|
CURLOPT_USERPWD
|
||
|
|
||
|
To avoid the regression when users pass in passwords containing semi-
|
||
|
colons, we now drop the ability to set the login options with the same
|
||
|
options. Support for login options in CURLOPT_USERPWD was added in
|
||
|
7.31.0.
|
||
|
|
||
|
Test case 83 was modified to verify that colons and semi-colons can be
|
||
|
used as part of the password when using -u (CURLOPT_USERPWD).
|
||
|
|
||
|
Bug: http://curl.haxx.se/bug/view.cgi?id=1311
|
||
|
Reported-by: Petr Bahula
|
||
|
Assisted-by: Steve Holme
|
||
|
Signed-off-by: Daniel Stenberg <daniel@haxx.se>
|
||
|
|
||
|
Upstream-commit: 169fedbdce93ecf14befb6e0e1ce6a2d480252a3
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 19 +++++--------------
|
||
|
tests/data/test83 | 4 ++--
|
||
|
2 files changed, 7 insertions(+), 16 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 558799c..8c76256 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -295,13 +295,11 @@ static CURLcode setstropt(char **charp, char *s)
|
||
|
return CURLE_OK;
|
||
|
}
|
||
|
|
||
|
-static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp,
|
||
|
- char **optionsp)
|
||
|
+static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
|
||
|
{
|
||
|
CURLcode result = CURLE_OK;
|
||
|
char *user = NULL;
|
||
|
char *passwd = NULL;
|
||
|
- char *options = NULL;
|
||
|
|
||
|
/* Parse the login details if specified. It not then we treat NULL as a hint
|
||
|
to clear the existing data */
|
||
|
@@ -309,7 +307,7 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp,
|
||
|
result = parse_login_details(option, strlen(option),
|
||
|
(userp ? &user : NULL),
|
||
|
(passwdp ? &passwd : NULL),
|
||
|
- (optionsp ? &options : NULL));
|
||
|
+ NULL);
|
||
|
}
|
||
|
|
||
|
if(!result) {
|
||
|
@@ -331,12 +329,6 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp,
|
||
|
Curl_safefree(*passwdp);
|
||
|
*passwdp = passwd;
|
||
|
}
|
||
|
-
|
||
|
- /* Store the options part of option if required */
|
||
|
- if(optionsp) {
|
||
|
- Curl_safefree(*optionsp);
|
||
|
- *optionsp = options;
|
||
|
- }
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
@@ -1553,12 +1545,11 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
||
|
|
||
|
case CURLOPT_USERPWD:
|
||
|
/*
|
||
|
- * user:password;options to use in the operation
|
||
|
+ * user:password to use in the operation
|
||
|
*/
|
||
|
result = setstropt_userpwd(va_arg(param, char *),
|
||
|
&data->set.str[STRING_USERNAME],
|
||
|
- &data->set.str[STRING_PASSWORD],
|
||
|
- &data->set.str[STRING_OPTIONS]);
|
||
|
+ &data->set.str[STRING_PASSWORD]);
|
||
|
break;
|
||
|
case CURLOPT_USERNAME:
|
||
|
/*
|
||
|
@@ -1631,7 +1622,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
||
|
*/
|
||
|
result = setstropt_userpwd(va_arg(param, char *),
|
||
|
&data->set.str[STRING_PROXYUSERNAME],
|
||
|
- &data->set.str[STRING_PROXYPASSWORD], NULL);
|
||
|
+ &data->set.str[STRING_PROXYPASSWORD]);
|
||
|
break;
|
||
|
case CURLOPT_PROXYUSERNAME:
|
||
|
/*
|
||
|
diff --git a/tests/data/test83 b/tests/data/test83
|
||
|
index 3015c9c..160b40c 100644
|
||
|
--- a/tests/data/test83
|
||
|
+++ b/tests/data/test83
|
||
|
@@ -46,7 +46,7 @@ http-proxy
|
||
|
HTTP over proxy-tunnel with site authentication
|
||
|
</name>
|
||
|
<command>
|
||
|
-http://%HOSTIP:%HTTPPORT/we/want/that/page/83 -p -x %HOSTIP:%PROXYPORT --user iam:myself
|
||
|
+http://%HOSTIP:%HTTPPORT/we/want/that/page/83 -p -x %HOSTIP:%PROXYPORT --user 'iam:my:;self'
|
||
|
</command>
|
||
|
</client>
|
||
|
|
||
|
@@ -65,7 +65,7 @@ Proxy-Connection: Keep-Alive
|
||
|
</proxy>
|
||
|
<protocol>
|
||
|
GET /we/want/that/page/83 HTTP/1.1
|
||
|
-Authorization: Basic aWFtOm15c2VsZg==
|
||
|
+Authorization: Basic aWFtOm15OjtzZWxm
|
||
|
User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
|
||
|
Host: %HOSTIP:%HTTPPORT
|
||
|
Accept: */*
|
||
|
--
|
||
|
2.4.6
|
||
|
|
||
|
|
||
|
From ffe3cb2b365e914e364a6c9d7611e6e7f60d3cfa Mon Sep 17 00:00:00 2001
|
||
|
From: Dan Fandrich <dan@coneharvesters.com>
|
||
|
Date: Wed, 29 Jan 2014 08:10:26 +0100
|
||
|
Subject: [PATCH 28/28] netrc: Fixed a memory leak in an OOM condition
|
||
|
|
||
|
Upstream-commit: 768151449b386488ac8fe869f48bf2930123d601
|
||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||
|
---
|
||
|
lib/url.c | 10 +++++++---
|
||
|
1 file changed, 7 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/lib/url.c b/lib/url.c
|
||
|
index 8c76256..57944e4 100644
|
||
|
--- a/lib/url.c
|
||
|
+++ b/lib/url.c
|
||
|
@@ -4666,13 +4666,17 @@ static CURLcode override_login(struct SessionHandle *data,
|
||
|
|
||
|
conn->bits.netrc = FALSE;
|
||
|
if(data->set.use_netrc != CURL_NETRC_IGNORED) {
|
||
|
- if(Curl_parsenetrc(conn->host.name,
|
||
|
- userp, passwdp,
|
||
|
- data->set.str[STRING_NETRC_FILE])) {
|
||
|
+ int ret = Curl_parsenetrc(conn->host.name,
|
||
|
+ userp, passwdp,
|
||
|
+ data->set.str[STRING_NETRC_FILE]);
|
||
|
+ if(ret > 0) {
|
||
|
infof(data, "Couldn't find host %s in the "
|
||
|
DOT_CHAR "netrc file; using defaults\n",
|
||
|
conn->host.name);
|
||
|
}
|
||
|
+ else if(ret < 0 ) {
|
||
|
+ return CURLE_OUT_OF_MEMORY;
|
||
|
+ }
|
||
|
else {
|
||
|
/* set bits.netrc TRUE to remember that we got the name from a .netrc
|
||
|
file, so that it is safe to use even if we followed a Location: to a
|
||
|
--
|
||
|
2.4.6
|
||
|
|