From: Daniel Stenberg Date: Tue, 4 Apr 2023 14:59:59 +0000 (+0200) Subject: urlapi: URL encoding for the URL missed the fragment X-Git-Tag: curl-8_1_0~219 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f042e1e75d03d248c4e3a0551672f80d4193d487;p=thirdparty%2Fcurl.git 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 --- diff --git a/lib/urlapi.c b/lib/urlapi.c index 62e3233064..7301463b10 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; + } } } } diff --git a/tests/libtest/lib1560.c b/tests/libtest/lib1560.c index 81f8f740c8..a16d16adf5 100644 --- a/tests/libtest/lib1560.c +++ b/tests/libtest/lib1560.c @@ -141,6 +141,9 @@ struct clearurlcase { }; static const struct testcase get_parts_list[] ={ + {"https://user@example.net?hello# space ", + "https | user | [12] | [13] | example.net | [15] | / | hello | %20space%20", + CURLU_ALLOW_SPACE|CURLU_URLENCODE, 0, CURLUE_OK}, {"https://test%test", "", 0, 0, CURLUE_BAD_HOSTNAME}, {"https://example.com%252f%40@example.net", "https | example.com%2f@ | [12] | [13] | example.net | [15] | / "