diff options
author | Daniel Stenberg <daniel@haxx.se> | 2023-04-04 16:59:59 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2023-04-05 08:30:12 +0200 |
commit | f042e1e75d03d248c4e3a0551672f80d4193d487 (patch) | |
tree | 42da756a5117225ca158794b7ee45ca07b30664d /lib | |
parent | 4399a532e9b7f340a3c8a573f3c2d36d2032bbc0 (diff) | |
download | curl-f042e1e75d03d248c4e3a0551672f80d4193d487.tar.gz |
urlapi: URL encoding for the URL missed the fragment
Meaning that it would wrongly still store the fragment using spaces
instead of %20 if allowing space while also asking for URL encoding.
Discovered when playing with trurl.
Added test to lib1560 to verify the fix.
Closes #10887
Diffstat (limited to 'lib')
-rw-r--r-- | lib/urlapi.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/lib/urlapi.c b/lib/urlapi.c index 62e323306..7301463b1 100644 --- a/lib/urlapi.c +++ b/lib/urlapi.c @@ -1131,15 +1131,26 @@ static CURLUcode parseurl(const char *url, CURLU *u, unsigned int flags) fraglen = strlen(fragment); if(fraglen > 1) { /* skip the leading '#' in the copy but include the terminating null */ - u->fragment = Curl_memdup(fragment + 1, fraglen); - if(!u->fragment) { - result = CURLUE_OUT_OF_MEMORY; - goto fail; + if(flags & CURLU_URLENCODE) { + struct dynbuf enc; + Curl_dyn_init(&enc, CURL_MAX_INPUT_LENGTH); + if(urlencode_str(&enc, fragment + 1, fraglen, TRUE, FALSE)) { + result = CURLUE_OUT_OF_MEMORY; + goto fail; + } + u->fragment = Curl_dyn_ptr(&enc); } + else { + u->fragment = Curl_memdup(fragment + 1, fraglen); + if(!u->fragment) { + result = CURLUE_OUT_OF_MEMORY; + goto fail; + } - if(junkscan(u->fragment, flags)) { - result = CURLUE_BAD_FRAGMENT; - goto fail; + if(junkscan(u->fragment, flags)) { + result = CURLUE_BAD_FRAGMENT; + goto fail; + } } } } |