From 6328804530e0788c19daec8f7011d53152058982 Mon Sep 17 00:00:00 2001
From: Felipe Pena <felipe@php.net>
Date: Wed, 31 Dec 2008 15:00:55 +0000
Subject: [PATCH] - Fixed bug #46973 (IPv6 address filter rejects valid
 address)

---
 ext/filter/logical_filters.c   | 14 +++++++++-----
 ext/filter/tests/bug46973.phpt | 14 ++++++++++++++
 2 files changed, 23 insertions(+), 5 deletions(-)
 create mode 100644 ext/filter/tests/bug46973.phpt

diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c
index 3725be298c1bf..f3d5be01b1644 100644
--- a/ext/filter/logical_filters.c
+++ b/ext/filter/logical_filters.c
@@ -530,7 +530,7 @@ static int _php_filter_validate_ipv6(char *str, int str_len TSRMLS_DC) /* {{{ */
 	int compressed = 0;
 	int blocks = 8;
 	int n;
-	char *ipv4;
+	char *ipv4 = NULL;
 	char *end;
 	int ip4elm[4];
 	char *s = str;
@@ -556,20 +556,24 @@ static int _php_filter_validate_ipv6(char *str, int str_len TSRMLS_DC) /* {{{ */
 		blocks = 6;
 	}
 
-	end = str + str_len;
+	end = ipv4 ? ipv4 : str + str_len;
+
 	while (str < end) {
 		if (*str == ':') {
 			if (--blocks == 0) {
+				if ((str+1) == end && ipv4) {
+					return 1;
+				}
 				return 0;
 			}			
 			if (++str >= end) {
-				return 0;
+				return (ipv4 && ipv4 == str && blocks == 3) || 0;
 			}
 			if (*str == ':') {
 				if (compressed || --blocks == 0) {
-					return 0;
+					return ipv4 != NULL;
 				}			
-				if (++str == end) {
+				if (++str == end || (ipv4 && ipv4 == str)) {
 					return 1;
 				}
 				compressed = 1;
diff --git a/ext/filter/tests/bug46973.phpt b/ext/filter/tests/bug46973.phpt
new file mode 100644
index 0000000000000..c9c5ba4301ade
--- /dev/null
+++ b/ext/filter/tests/bug46973.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Bug #46973 (IPv6 address filter rejects valid address)
+--FILE--
+<?php
+
+var_dump(filter_var('1fff::a88:85a3::172.31.128.1', FILTER_VALIDATE_IP,FILTER_FLAG_IPV6));
+var_dump(filter_var('3ffe:6a88:85a3:08d3:1319:8a2e:0370:7344', FILTER_VALIDATE_IP,FILTER_FLAG_IPV6));
+var_dump(filter_var('1fff::a88:85a3::172.31.128.1', FILTER_VALIDATE_IP,FILTER_FLAG_IPV6));
+ 
+?>
+--EXPECTF--
+string(28) "1fff::a88:85a3::172.31.128.1"
+string(39) "3ffe:6a88:85a3:08d3:1319:8a2e:0370:7344"
+string(28) "1fff::a88:85a3::172.31.128.1"