iliaa                                    Sun, 12 Dec 2010 19:54:21 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=306290

Log:
Fixed bug #47435 (FILTER_FLAG_NO_RES_RANGE don't work with ipv6).

Bug: http://bugs.php.net/47435 (Open) FILTER_FLAG_NO_PRIV_RANGE and 
FILTER_FLAG_NO_RES_RANGE don't work with ipv6
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/filter/logical_filters.c
    U   php/php-src/branches/PHP_5_3/ext/filter/tests/018.phpt
    A   php/php-src/branches/PHP_5_3/ext/filter/tests/bug47435.phpt
    U   php/php-src/trunk/ext/filter/logical_filters.c
    U   php/php-src/trunk/ext/filter/tests/018.phpt
    A   php/php-src/trunk/ext/filter/tests/bug47435.phpt

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS	2010-12-12 19:35:11 UTC (rev 306289)
+++ php/php-src/branches/PHP_5_3/NEWS	2010-12-12 19:54:21 UTC (rev 306290)
@@ -13,6 +13,8 @@
 - Filter extension:
   . Fixed bug #53150 (FILTER_FLAG_NO_RES_RANGE is missing some IP ranges).
     (Ilia)
+  . Fixed bug #47435 (FILTER_FLAG_NO_RES_RANGE don't work with ipv6).
+    (Ilia, valli at icsurselva dot ch)

 - Intl extension:
   . Fixed bug #53512 (NumberFormatter::setSymbol crash on bogus $attr values).

Modified: php/php-src/branches/PHP_5_3/ext/filter/logical_filters.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/filter/logical_filters.c	2010-12-12 19:35:11 UTC (rev 306289)
+++ php/php-src/branches/PHP_5_3/ext/filter/logical_filters.c	2010-12-12 19:54:21 UTC (rev 306290)
@@ -735,8 +735,40 @@
 						RETURN_VALIDATION_FAILED
 					}
 				}
-				if (flags & FILTER_FLAG_NO_RES_RANGE && Z_STRLEN_P(value) == 3 && !strcmp("::1", Z_STRVAL_P(value))) {
-					RETURN_VALIDATION_FAILED
+				if (flags & FILTER_FLAG_NO_RES_RANGE) {
+					switch (Z_STRLEN_P(value)) {
+						case 1: case 0:
+							break;
+						case 2:
+							if (!strcmp("::", Z_STRVAL_P(value))) {
+								RETURN_VALIDATION_FAILED
+							}
+							break;
+						case 3:
+							if (!strcmp("::1", Z_STRVAL_P(value)) || !strcmp("5f:", Z_STRVAL_P(value))) {
+								RETURN_VALIDATION_FAILED
+							}
+							break;
+						default:
+							if (Z_STRLEN_P(value) >= 5) {
+								if (
+									!strncasecmp("fe8", Z_STRVAL_P(value), 3) ||
+									!strncasecmp("fe9", Z_STRVAL_P(value), 3) ||
+									!strncasecmp("fea", Z_STRVAL_P(value), 3) ||
+									!strncasecmp("feb", Z_STRVAL_P(value), 3)
+								) {
+									RETURN_VALIDATION_FAILED
+								}
+							}
+							if (
+								(Z_STRLEN_P(value) >= 9 &&  !strncasecmp("2001:0db8", Z_STRVAL_P(value), 9)) ||
+								(Z_STRLEN_P(value) >= 2 &&  !strncasecmp("5f", Z_STRVAL_P(value), 2)) ||
+								(Z_STRLEN_P(value) >= 4 &&  !strncasecmp("3ff3", Z_STRVAL_P(value), 4)) ||
+								(Z_STRLEN_P(value) >= 8 &&  !strncasecmp("2001:001", Z_STRVAL_P(value), 8))
+							) {
+								RETURN_VALIDATION_FAILED
+							}
+					}
 				}
 			}
 			break;

Modified: php/php-src/branches/PHP_5_3/ext/filter/tests/018.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/filter/tests/018.phpt	2010-12-12 19:35:11 UTC (rev 306289)
+++ php/php-src/branches/PHP_5_3/ext/filter/tests/018.phpt	2010-12-12 19:54:21 UTC (rev 306290)
@@ -24,6 +24,7 @@
 var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV4));
 var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
 var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
 var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV4));
 echo "Done\n";
 ?>
@@ -48,5 +49,6 @@
 bool(false)
 bool(false)
 string(3) "::1"
+bool(false)
 string(9) "127.0.0.1"
 Done

Added: php/php-src/branches/PHP_5_3/ext/filter/tests/bug47435.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/filter/tests/bug47435.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/filter/tests/bug47435.phpt	2010-12-12 19:54:21 UTC (rev 306290)
@@ -0,0 +1,34 @@
+--TEST--
+Bug #47435 (FILTER_FLAG_NO_PRIV_RANGE and FILTER_FLAG_NO_RES_RANGE don't work with ipv6)
+--FILE--
+<?php
+var_dump(filter_var("FC00::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("FC00::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE));
+var_dump(filter_var("::", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("::", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("fe8:5:6::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("fe8:5:6::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("2001:0db8::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("2001:0db8::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("5f::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("5f::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("3ff3::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("3ff3::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+?>
+--EXPECT--
+string(7) "FC00::1"
+bool(false)
+string(2) "::"
+bool(false)
+string(3) "::1"
+bool(false)
+string(10) "fe8:5:6::1"
+bool(false)
+string(12) "2001:0db8::1"
+bool(false)
+string(5) "5f::1"
+bool(false)
+string(7) "3ff3::1"
+bool(false)

Modified: php/php-src/trunk/ext/filter/logical_filters.c
===================================================================
--- php/php-src/trunk/ext/filter/logical_filters.c	2010-12-12 19:35:11 UTC (rev 306289)
+++ php/php-src/trunk/ext/filter/logical_filters.c	2010-12-12 19:54:21 UTC (rev 306290)
@@ -735,8 +735,40 @@
 						RETURN_VALIDATION_FAILED
 					}
 				}
-				if (flags & FILTER_FLAG_NO_RES_RANGE && Z_STRLEN_P(value) == 3 && !strcmp("::1", Z_STRVAL_P(value))) {
-					RETURN_VALIDATION_FAILED
+				if (flags & FILTER_FLAG_NO_RES_RANGE) {
+					switch (Z_STRLEN_P(value)) {
+						case 1: case 0:
+							break;
+						case 2:
+							if (!strcmp("::", Z_STRVAL_P(value))) {
+								RETURN_VALIDATION_FAILED
+							}
+							break;
+						case 3:
+							if (!strcmp("::1", Z_STRVAL_P(value)) || !strcmp("5f:", Z_STRVAL_P(value))) {
+								RETURN_VALIDATION_FAILED
+							}
+							break;
+						default:
+							if (Z_STRLEN_P(value) >= 5) {
+								if (
+									!strncasecmp("fe8", Z_STRVAL_P(value), 3) ||
+									!strncasecmp("fe9", Z_STRVAL_P(value), 3) ||
+									!strncasecmp("fea", Z_STRVAL_P(value), 3) ||
+									!strncasecmp("feb", Z_STRVAL_P(value), 3)
+								) {
+									RETURN_VALIDATION_FAILED
+								}
+							}
+							if (
+								(Z_STRLEN_P(value) >= 9 &&  !strncasecmp("2001:0db8", Z_STRVAL_P(value), 9)) ||
+								(Z_STRLEN_P(value) >= 2 &&  !strncasecmp("5f", Z_STRVAL_P(value), 2)) ||
+								(Z_STRLEN_P(value) >= 4 &&  !strncasecmp("3ff3", Z_STRVAL_P(value), 4)) ||
+								(Z_STRLEN_P(value) >= 8 &&  !strncasecmp("2001:001", Z_STRVAL_P(value), 8))
+							) {
+								RETURN_VALIDATION_FAILED
+							}
+					}
 				}
 			}
 			break;

Modified: php/php-src/trunk/ext/filter/tests/018.phpt
===================================================================
--- php/php-src/trunk/ext/filter/tests/018.phpt	2010-12-12 19:35:11 UTC (rev 306289)
+++ php/php-src/trunk/ext/filter/tests/018.phpt	2010-12-12 19:54:21 UTC (rev 306290)
@@ -24,6 +24,7 @@
 var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV4));
 var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
 var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
 var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV4));
 echo "Done\n";
 ?>
@@ -48,5 +49,6 @@
 bool(false)
 bool(false)
 string(3) "::1"
+bool(false)
 string(9) "127.0.0.1"
 Done

Added: php/php-src/trunk/ext/filter/tests/bug47435.phpt
===================================================================
--- php/php-src/trunk/ext/filter/tests/bug47435.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/filter/tests/bug47435.phpt	2010-12-12 19:54:21 UTC (rev 306290)
@@ -0,0 +1,34 @@
+--TEST--
+Bug #47435 (FILTER_FLAG_NO_PRIV_RANGE and FILTER_FLAG_NO_RES_RANGE don't work with ipv6)
+--FILE--
+<?php
+var_dump(filter_var("FC00::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("FC00::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE));
+var_dump(filter_var("::", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("::", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("fe8:5:6::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("fe8:5:6::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("2001:0db8::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("2001:0db8::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("5f::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("5f::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+var_dump(filter_var("3ff3::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
+var_dump(filter_var("3ff3::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));
+?>
+--EXPECT--
+string(7) "FC00::1"
+bool(false)
+string(2) "::"
+bool(false)
+string(3) "::1"
+bool(false)
+string(10) "fe8:5:6::1"
+bool(false)
+string(12) "2001:0db8::1"
+bool(false)
+string(5) "5f::1"
+bool(false)
+string(7) "3ff3::1"
+bool(false)
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to