urlapi: respect CURLU_ALLOW_SPACE and CURLU_NO_AUTHORITY for redirects

curl_url_set(uh, CURLUPART_URL, redirurl, flags)  was not respecing
CURLU_ALLOW_SPACE and CURLU_NO_AUTHORITY in the host part of redirurl
when redirecting to an absolute URL.

Closes #11136
This commit is contained in:
Emanuele Torre 2023-05-18 10:48:19 +02:00 коммит произвёл Daniel Stenberg
Родитель e743425bc6
Коммит df6c2f7b54
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 5CC908FDB71E12C2
2 изменённых файлов: 18 добавлений и 6 удалений

Просмотреть файл

@ -617,7 +617,8 @@ static CURLUcode ipv6_parse(struct Curl_URL *u, char *hostname,
}
static CURLUcode hostname_check(struct Curl_URL *u, char *hostname,
size_t hlen) /* length of hostname */
size_t hlen, /* length of hostname */
unsigned int flags)
{
size_t len;
DEBUGASSERT(hostname);
@ -627,8 +628,10 @@ static CURLUcode hostname_check(struct Curl_URL *u, char *hostname,
else if(hostname[0] == '[')
return ipv6_parse(u, hostname, hlen);
else {
/* letters from the second string are not ok */
len = strcspn(hostname, " \r\n\t/:#?!@{}[]\\$\'\"^`*<>=;,+&()%");
static char bad_chars[] = " \r\n\t/:#?!@{}[]\\$\'\"^`*<>=;,+&()%";
len = strcspn(hostname, (flags & CURLU_ALLOW_SPACE)
? &bad_chars[1] /* space is allowed */
: bad_chars);
if(hlen != len)
/* hostname with bad content */
return CURLUE_BAD_HOSTNAME;
@ -801,8 +804,9 @@ static CURLUcode parse_authority(struct Curl_URL *u,
break;
case HOST_NAME:
result = urldecode_host(host);
if(!result)
result = hostname_check(u, Curl_dyn_ptr(host), Curl_dyn_len(host));
if(!result && !(flags & CURLU_NO_AUTHORITY))
result = hostname_check(u, Curl_dyn_ptr(host), Curl_dyn_len(host),
flags);
break;
case HOST_ERROR:
result = CURLUE_OUT_OF_MEMORY;
@ -1888,7 +1892,7 @@ nomem:
/* Skip hostname check, it's allowed to be empty. */
}
else {
if(!n || hostname_check(u, (char *)newp, n)) {
if(!n || hostname_check(u, (char *)newp, n, flags)) {
free((char *)newp);
return CURLUE_BAD_HOSTNAME;
}

Просмотреть файл

@ -984,6 +984,14 @@ static const struct redircase set_url_list[] = {
"../newpage",
"http://user:foo@example.com/newpage",
0, 0, CURLUE_OK},
{"http://user:foo@example.com/path?query#frag",
"http://example org/",
"http://example org/",
0, CURLU_ALLOW_SPACE, CURLUE_OK},
{"http://user:foo@example.com/path?query#frag",
"http://?hi",
"http:///?hi",
0, CURLU_NO_AUTHORITY, CURLUE_OK},
{NULL, NULL, NULL, 0, 0, CURLUE_OK}
};