diff options
| -rw-r--r-- | lib/urlapi.c | 17 | 
1 files changed, 16 insertions, 1 deletions
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;      }  | 
