summaryrefslogtreecommitdiff
path: root/lib/urlapi.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2023-04-04 16:59:59 +0200
committerDaniel Stenberg <daniel@haxx.se>2023-04-05 08:30:12 +0200
commitf042e1e75d03d248c4e3a0551672f80d4193d487 (patch)
tree42da756a5117225ca158794b7ee45ca07b30664d /lib/urlapi.c
parent4399a532e9b7f340a3c8a573f3c2d36d2032bbc0 (diff)
downloadcurl-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/urlapi.c')
-rw-r--r--lib/urlapi.c25
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;
+ }
}
}
}