From 71495c3ccb3d2ad8c106f82d559044f583675caf Mon Sep 17 00:00:00 2001 From: Arturo Bernal Date: Wed, 8 Oct 2025 15:08:39 +0200 Subject: [PATCH] =?UTF-8?q?Accept=20leading=20zeros=20in=20IPv4-mapped=20I?= =?UTF-8?q?Pv6=20Relax=20pattern=20for=20mapped=20IPv4=20octets=20(?= =?UTF-8?q?=E2=89=A4255);=20standalone=20IPv4=20rules=20unchanged.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/hc/core5/net/InetAddressUtils.java | 9 +++++++-- .../hc/core5/net/TestInetAddressUtils.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/httpcore5/src/main/java/org/apache/hc/core5/net/InetAddressUtils.java b/httpcore5/src/main/java/org/apache/hc/core5/net/InetAddressUtils.java index f9543f9f6d..21dadf1cbd 100644 --- a/httpcore5/src/main/java/org/apache/hc/core5/net/InetAddressUtils.java +++ b/httpcore5/src/main/java/org/apache/hc/core5/net/InetAddressUtils.java @@ -66,8 +66,13 @@ private InetAddressUtils() { private static final Pattern IPV4_PATTERN = Pattern.compile("^" + IPV4_BASIC_PATTERN_STRING + "$"); - private static final Pattern IPV4_MAPPED_IPV6_PATTERN = // TODO does not allow for redundant leading zeros - Pattern.compile("^::[fF]{4}:" + IPV4_BASIC_PATTERN_STRING + "$"); + // Accept IPv4-mapped IPv6, allowing redundant leading zeros in the IPv4 part. + // Examples: ::ffff:1.2.3.4, ::FFFF:001.002.003.004 + // Still enforces each octet <= 255 and max 3 digits per octet. + private static final String IPV4_MAPPED_OCTET = "(25[0-5]|2[0-4]\\d|1\\d\\d|0?\\d?\\d)"; + private static final Pattern IPV4_MAPPED_IPV6_PATTERN = Pattern.compile("^::[fF]{4}:((" + IPV4_MAPPED_OCTET + ")\\.){3}" + IPV4_MAPPED_OCTET + "$"); + + private static final Pattern IPV6_STD_PATTERN = Pattern.compile( diff --git a/httpcore5/src/test/java/org/apache/hc/core5/net/TestInetAddressUtils.java b/httpcore5/src/test/java/org/apache/hc/core5/net/TestInetAddressUtils.java index 96fd69fff1..3471c2d92c 100644 --- a/httpcore5/src/test/java/org/apache/hc/core5/net/TestInetAddressUtils.java +++ b/httpcore5/src/test/java/org/apache/hc/core5/net/TestInetAddressUtils.java @@ -198,4 +198,22 @@ void testInValidIPv4MappedIPv6Address() { Assertions.assertFalse(InetAddressUtils.isIPv4MappedIPv6("::ffff:1:2:3:4")); } + @Test + void testValidIPv4MappedIPv6AddressWithLeadingZeros() { + Assertions.assertTrue(InetAddressUtils.isIPv4MappedIPv6("::ffff:001.002.003.004")); + Assertions.assertTrue(InetAddressUtils.isIPv4MappedIPv6("::FFFF:000.000.000.255")); + Assertions.assertTrue(InetAddressUtils.isIPv4MappedIPv6("::ffff:010.020.030.040")); + } + + @Test + void testInvalidIPv4MappedIPv6AddressWithBadOctets() { + // >255 not allowed + Assertions.assertFalse(InetAddressUtils.isIPv4MappedIPv6("::ffff:256.000.000.000")); + // too few octets + Assertions.assertFalse(InetAddressUtils.isIPv4MappedIPv6("::ffff:01.02.03")); + // too many digits in an octet (4 digits) + Assertions.assertFalse(InetAddressUtils.isIPv4MappedIPv6("::ffff:0255.000.000.000")); + } + + }