URL parse: user name with ipv6 numerical address

Using a URL with embedded user name and password didn't work if the host
was given as a numerical IPv6 string, like ftp://user:password@[::1]/

Reported by: Brandon Wang
Bug: http://curl.haxx.se/mail/archive-2012-01/0047.html
This commit is contained in:
Daniel Stenberg 2012-01-20 23:32:43 +01:00
parent d7af7de5b2
commit 7883cd5af3
1 changed files with 16 additions and 12 deletions

View File

@ -137,7 +137,9 @@ static long ConnectionKillOne(struct SessionHandle *data);
static void conn_free(struct connectdata *conn); static void conn_free(struct connectdata *conn);
static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke); static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke);
static CURLcode do_init(struct connectdata *conn); static CURLcode do_init(struct connectdata *conn);
static CURLcode parse_url_userpass(struct SessionHandle *data,
struct connectdata *conn,
char *user, char *passwd);
/* /*
* Protocol table. * Protocol table.
*/ */
@ -3666,7 +3668,9 @@ static CURLcode findprotocol(struct SessionHandle *data,
*/ */
static CURLcode parseurlandfillconn(struct SessionHandle *data, static CURLcode parseurlandfillconn(struct SessionHandle *data,
struct connectdata *conn, struct connectdata *conn,
bool *prot_missing) bool *prot_missing,
char *user,
char *passwd)
{ {
char *at; char *at;
char *fragment; char *fragment;
@ -3675,6 +3679,7 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
int rc; int rc;
char protobuf[16]; char protobuf[16];
const char *protop; const char *protop;
CURLcode result;
*prot_missing = FALSE; *prot_missing = FALSE;
@ -3841,6 +3846,14 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
path[0] = '/'; path[0] = '/';
} }
/*************************************************************
* 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);
if(result != CURLE_OK)
return result;
if(conn->host.name[0] == '[') { if(conn->host.name[0] == '[') {
/* This looks like an IPv6 address literal. See if there is an address /* This looks like an IPv6 address literal. See if there is an address
scope. */ scope. */
@ -4783,7 +4796,7 @@ static CURLcode create_conn(struct SessionHandle *data,
conn->host.name = conn->host.rawalloc; conn->host.name = conn->host.rawalloc;
conn->host.name[0] = 0; conn->host.name[0] = 0;
result = parseurlandfillconn(data, conn, &prot_missing); result = parseurlandfillconn(data, conn, &prot_missing, user, passwd);
if(result != CURLE_OK) if(result != CURLE_OK)
return result; return result;
@ -4812,15 +4825,6 @@ static CURLcode create_conn(struct SessionHandle *data,
data->change.url_alloc = TRUE; /* free this later */ 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);
if(result != CURLE_OK)
return result;
/************************************************************* /*************************************************************
* If the protocol can't handle url query strings, then cut * If the protocol can't handle url query strings, then cut
* of the unhandable part * of the unhandable part