diff --git a/lib/urlapi.c b/lib/urlapi.c index 1c13077ec..a57c5e72e 100644 --- a/lib/urlapi.c +++ b/lib/urlapi.c @@ -851,6 +851,16 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags) if(junkscan(path)) return CURLUE_MALFORMED_INPUT; + if((flags & CURLU_URLENCODE) && path[0]) { + /* worst case output length is 3x the original! */ + char *newp = malloc(strlen(path) * 3); + if(!newp) + return CURLUE_OUT_OF_MEMORY; + path_alloced = TRUE; + strcpy_url(newp, path, TRUE); /* consider it relative */ + path = newp; + } + fragment = strchr(path, '#'); if(fragment) *fragment++ = 0; @@ -865,11 +875,16 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags) else if(!(flags & CURLU_PATH_AS_IS)) { /* sanitise paths and remove ../ and ./ sequences according to RFC3986 */ char *newp = Curl_dedotdotify(path); - if(!newp) + if(!newp) { + if(path_alloced) + free(path); return CURLUE_OUT_OF_MEMORY; + } if(strcmp(newp, path)) { /* if we got a new version */ + if(path_alloced) + free(path); path = newp; path_alloced = TRUE; }