Skip to content

Commit

Permalink
urlapi: URL encoding for the URL missed the fragment
Browse files Browse the repository at this point in the history
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
  • Loading branch information
bagder committed Apr 5, 2023
1 parent 4399a53 commit f042e1e
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
25 changes: 18 additions & 7 deletions lib/urlapi.c
Expand Up @@ -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;
}
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions tests/libtest/lib1560.c
Expand Up @@ -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] | / "
Expand Down

0 comments on commit f042e1e

Please sign in to comment.