diff options
author | Daniel Stenberg <daniel@haxx.se> | 2019-10-01 09:53:28 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2019-10-02 07:53:17 +0200 |
commit | 2c20109a9b5d0499a14a0226e68d55d027ecdb20 (patch) | |
tree | 367871b9c22a6e11bdd4371eff74a7b355bc8d52 /lib/urlapi.c | |
parent | 54c622aa8eac9d861612290b5de15ff3fa45c5eb (diff) | |
download | curl-2c20109a9b5d0499a14a0226e68d55d027ecdb20.tar.gz |
urlapi: fix URL encoding when setting a full URL
Diffstat (limited to 'lib/urlapi.c')
-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; } |