noproxy: fix the IPV6 network mask pattern match

It would mismatch if the network prefix length with was not divisible by
8.

Extended test 1614 to verify

Reported-by: Stanislav Fort

Closes #18891
This commit is contained in:
Daniel Stenberg 2025-10-06 16:53:27 +02:00
parent 71b5e02590
commit 1a3a5cb720
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
2 changed files with 23 additions and 1 deletions

View file

@ -99,7 +99,7 @@ UNITTEST bool Curl_cidr6_match(const char *ipv6,
return FALSE;
if(bytes && memcmp(address, check, bytes))
return FALSE;
if(rest && !((address[bytes] ^ check[bytes]) & (0xff << (8 - rest))))
if(rest && ((address[bytes] ^ check[bytes]) & (0xff << (8 - rest))))
return FALSE;
return TRUE;

View file

@ -111,6 +111,28 @@ static CURLcode test_unit1614(const char *arg)
{ "[::1]", "foo, bar, ::1/64", TRUE},
{ "[::1]", "::1/64", TRUE},
{ "[::1]", "::1/96", TRUE},
{ "[::1]", "::1/127", TRUE},
{ "[::1]", "::1/126", TRUE},
{ "[::1]", "::1/125", TRUE},
{ "[::1]", "::1/124", TRUE},
{ "[::1]", "::1/123", TRUE},
{ "[::1]", "::1/122", TRUE},
{ "[2001:db8:8000::1]", "2001:db8::/65", FALSE},
{ "[2001:db8:8000::1]", "2001:db8::/66", FALSE},
{ "[2001:db8:8000::1]", "2001:db8::/67", FALSE},
{ "[2001:db8:8000::1]", "2001:db8::/68", FALSE},
{ "[2001:db8:8000::1]", "2001:db8::/69", FALSE},
{ "[2001:db8:8000::1]", "2001:db8::/70", FALSE},
{ "[2001:db8:8000::1]", "2001:db8::/71", FALSE},
{ "[2001:db8:8000::1]", "2001:db8::/72", FALSE},
{ "[2001:db8::1]", "2001:db8::/65", TRUE},
{ "[2001:db8::1]", "2001:db8::/66", TRUE},
{ "[2001:db8::1]", "2001:db8::/67", TRUE},
{ "[2001:db8::1]", "2001:db8::/68", TRUE},
{ "[2001:db8::1]", "2001:db8::/69", TRUE},
{ "[2001:db8::1]", "2001:db8::/70", TRUE},
{ "[2001:db8::1]", "2001:db8::/71", TRUE},
{ "[2001:db8::1]", "2001:db8::/72", TRUE},
{ "[::1]", "::1/129", FALSE},
{ "bar", "foo, bar, ::1/64", TRUE},
{ "BAr", "foo, bar, ::1/64", TRUE},