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