urlapi: treat 0 alone as decimal number in IPv4 address

Not as a broken octcal. Regression from b4538ec522

Extended test 1560 to verify this behavior.

Reported-by: Carlos Henrique Lima Melara

Closes #16652
This commit is contained in:
Daniel Stenberg 2025-03-10 13:42:42 +01:00
parent bad5e71331
commit 19d6415273
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
2 changed files with 35 additions and 3 deletions

View file

@ -578,9 +578,8 @@ static int ipv4_normalize(struct dynbuf *host)
int rc;
curl_off_t l;
if(*c == '0') {
c++;
if(*c == 'x') {
c++; /* skip the prefix */
if(c[1] == 'x') {
c += 2; /* skip the prefix */
rc = Curl_str_hex(&c, &l, UINT_MAX);
}
else

View file

@ -529,6 +529,39 @@ static const struct testcase get_parts_list[] ={
};
static const struct urltestcase get_url_list[] = {
{"018.0.0.0", "http://018.0.0.0/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"08", "http://08/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0", "http://0.0.0.0/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"01", "http://0.0.0.1/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"02", "http://0.0.0.2/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"03", "http://0.0.0.3/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"04", "http://0.0.0.4/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"05", "http://0.0.0.5/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"06", "http://0.0.0.6/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"07", "http://0.0.0.7/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"07.1", "http://7.0.0.1/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"7.1", "http://7.0.0.1/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x7.1", "http://7.0.0.1/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x", "http://0x/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x1", "http://0.0.0.1/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x2", "http://0.0.0.2/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x3", "http://0.0.0.3/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x4", "http://0.0.0.4/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x5", "http://0.0.0.5/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x6", "http://0.0.0.6/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x7", "http://0.0.0.7/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x8", "http://0.0.0.8/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0x9", "http://0.0.0.9/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0xa", "http://0.0.0.10/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0xb", "http://0.0.0.11/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0xc", "http://0.0.0.12/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0xd", "http://0.0.0.13/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0xe", "http://0.0.0.14/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0xf", "http://0.0.0.15/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"0xg", "http://0xg/", CURLU_GUESS_SCHEME, 0, CURLUE_OK},
{"https://0/", "https://0.0.0.0/", 0, 0, CURLUE_OK},
{"https://0.0x0/", "https://0.0.0.0/", 0, 0, CURLUE_OK},
{"https://0.000/", "https://0.0.0.0/", 0, 0, CURLUE_OK},
{"example.com",
"example.com/",
CURLU_GUESS_SCHEME, CURLU_NO_GUESS_SCHEME, CURLUE_OK},