aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/urlapi.c17
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;
}