From dd2dc943989cae6a2a13e655cde6ebc2e59f502d Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Mon, 3 Jun 2013 18:29:55 +0200 Subject: [PATCH] Fixed detection of IPv4 addresses embedded into IPv6 --- .../install/files/lib/util/UserUtil.class.php | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/wcfsetup/install/files/lib/util/UserUtil.class.php b/wcfsetup/install/files/lib/util/UserUtil.class.php index 116ed6ee0f..ebcb8e4388 100644 --- a/wcfsetup/install/files/lib/util/UserUtil.class.php +++ b/wcfsetup/install/files/lib/util/UserUtil.class.php @@ -166,19 +166,26 @@ final class UserUtil { // check if ip is a masked IPv4 address if (substr($ip, 0, 7) == '::ffff:') { - $ip = explode(':', substr($ip, 7)); - $ip[0] = base_convert($ip[0], 16, 10); - $ip[1] = base_convert($ip[1], 16, 10); - - $ipParts = array(); - $tmp = $ip[0] % 256; - $ipParts[] = ($ip[0] - $tmp) / 256; - $ipParts[] = $tmp; - $tmp = $ip[1] % 256; - $ipParts[] = ($ip[1] - $tmp) / 256; - $ipParts[] = $tmp; - - return implode('.', $ipParts); + $ip = substr($ip, 7); + if (preg_match('~^([a-f0-9]{4}):([a-f0-9]{4})$~', $ip, $matches)) { + $ip = array( + base_convert($matches[1], 16, 10), + base_convert($matches[2], 16, 10) + ); + + $ipParts = array(); + $tmp = $ip[0] % 256; + $ipParts[] = ($ip[0] - $tmp) / 256; + $ipParts[] = $tmp; + $tmp = $ip[1] % 256; + $ipParts[] = ($ip[1] - $tmp) / 256; + $ipParts[] = $tmp; + + return implode('.', $ipParts); + } + else { + return $ip; + } } else { // given ip is an IPv6 address and cannot be converted -- 2.20.1