diff --git a/lib/dict.c b/lib/dict.c index b592266cd..a012dc1cf 100644 --- a/lib/dict.c +++ b/lib/dict.c @@ -233,7 +233,7 @@ CURLcode dict(struct connectdata *conn) int i; ppath++; - for (i = 0; (i < URL_MAX_LENGTH) && (ppath[i]); i++) { + for (i = 0; ppath[i]; i++) { if (ppath[i] == ':') ppath[i] = ' '; } diff --git a/lib/http.c b/lib/http.c index d5241acec..2ff643248 100644 --- a/lib/http.c +++ b/lib/http.c @@ -327,7 +327,7 @@ CURLcode http(struct connectdata *conn) } if ((data->bits.httpproxy) && !(conn->protocol&PROT_HTTPS)) { /* The path sent to the proxy is in fact the entire URL */ - strncpy(ppath, data->url, URL_MAX_LENGTH-1); + ppath = data->url; } if(data->bits.http_formpost) { /* we must build the whole darned post sequence first, so that we have diff --git a/lib/url.c b/lib/url.c index 4e9d1bd2c..f212bb5d0 100644 --- a/lib/url.c +++ b/lib/url.c @@ -677,6 +677,9 @@ CURLcode curl_disconnect(CURLconnect *c_connect) if(conn->hostent_buf) /* host name info */ free(conn->hostent_buf); + if(conn->path) /* the URL path part */ + free(conn->path); + free(conn); /* free the connection oriented data */ /* clean up the sockets and SSL stuff from the previous "round" */ @@ -696,6 +699,7 @@ static CURLcode _connect(CURL *curl, CURLconnect **in_connect) #ifdef HAVE_SIGACTION struct sigaction sigact; #endif + int urllen; if(!data || (data->handle != STRUCT_OPEN)) return CURLE_BAD_FUNCTION_ARGUMENT; /* TBD: make error codes */ @@ -734,13 +738,25 @@ static CURLcode _connect(CURL *curl, CURLconnect **in_connect) #endif + /* We need to allocate memory to store the path in. We get the size of the + full URL to be sure, and we need to make it at least 256 bytes since + other parts of the code will rely on this fact */ +#define LEAST_PATH_ALLOC 256 + urllen=strlen(data->url); + if(urllen < LEAST_PATH_ALLOC) + urllen=LEAST_PATH_ALLOC; + + conn->path=(char *)malloc(urllen); + if(NULL == conn->path) + return CURLE_OUT_OF_MEMORY; /* really bad error */ + /* Parse */ /* We need to parse the url, even when using the proxy, because * we will need the hostname and port in case we are trying * to SSL connect through the proxy -- and we don't know if we * will need to use SSL until we parse the url ... */ - if((2 == sscanf(data->url, "%64[^:]://%" URL_MAX_LENGTH_TXT "[^\n]", + if((2 == sscanf(data->url, "%64[^:]://%[^\n]", conn->proto, conn->path)) && strequal(conn->proto, "file")) { /* we deal with file:/// differently since it @@ -760,11 +776,11 @@ static CURLcode _connect(CURL *curl, CURLconnect **in_connect) strcpy(conn->path, "/"); if (2 > sscanf(data->url, - "%64[^\n:]://%256[^\n/]%" URL_MAX_LENGTH_TXT "[^\n]", + "%64[^\n:]://%256[^\n/]%[^\n]", conn->proto, conn->gname, conn->path)) { /* badly formatted, let's try the browser-style _without_ 'http://' */ - if((1 > sscanf(data->url, "%256[^\n/]%" URL_MAX_LENGTH_TXT "[^\n]", + if((1 > sscanf(data->url, "%256[^\n/]%[^\n]", conn->gname, conn->path)) ) { failf(data, " malformed"); return CURLE_URL_MALFORMAT; @@ -1548,6 +1564,8 @@ CURLcode curl_connect(CURL *curl, CURLconnect **in_connect) in the connectdata struct, free those here */ conn = (struct connectdata *)*in_connect; if(conn) { + if(conn->path) + free(conn->path); if(conn->hostent_buf) free(conn->hostent_buf); free(conn); diff --git a/lib/urldata.h b/lib/urldata.h index bda19f73b..de16ea17d 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -175,7 +175,7 @@ struct connectdata { char proto[64]; char gname[256]; char *name; - char path[URL_MAX_LENGTH]; + char *path; /* formerly staticly this size: URL_MAX_LENGTH */ char *ppath; long bytecount; struct timeval now;