From 19d6415273b35e74ebabdf627c9d7a5725fb4bf8 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 10 Mar 2025 13:42:42 +0100 Subject: [PATCH] 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 --- lib/urlapi.c | 5 ++--- tests/libtest/lib1560.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/urlapi.c b/lib/urlapi.c index 30fe0ba8c7..7ad8a1fb23 100644 --- a/lib/urlapi.c +++ b/lib/urlapi.c @@ -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 diff --git a/tests/libtest/lib1560.c b/tests/libtest/lib1560.c index 75c96ad0b2..95971ec7a5 100644 --- a/tests/libtest/lib1560.c +++ b/tests/libtest/lib1560.c @@ -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}, -- 2.47.3