]> granicus.if.org Git - php/commitdiff
Fixed bug #47435 (FILTER_FLAG_NO_RES_RANGE don't work with ipv6).
authorIlia Alshanetsky <iliaa@php.net>
Sun, 12 Dec 2010 19:54:21 +0000 (19:54 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Sun, 12 Dec 2010 19:54:21 +0000 (19:54 +0000)
ext/filter/logical_filters.c
ext/filter/tests/018.phpt
ext/filter/tests/bug47435.phpt [new file with mode: 0644]

index f6a7c82fd280a5511d5d3e59a741c29756db2c9f..52f7a851d2ae1b6aa30d55060f130993559d0548 100644 (file)
@@ -735,8 +735,40 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
                                                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;
index 13122bdc557975e8b1e7cc443e9e5259255094e5..af52b2e60d67e9bdca799fdff2704203d47c1ca9 100644 (file)
@@ -24,6 +24,7 @@ var_dump(filter_var(-1, FILTER_VALIDATE_IP));
 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)
 bool(false)
 string(3) "::1"
+bool(false)
 string(9) "127.0.0.1"
 Done
diff --git a/ext/filter/tests/bug47435.phpt b/ext/filter/tests/bug47435.phpt
new file mode 100644 (file)
index 0000000..42705fd
--- /dev/null
@@ -0,0 +1,34 @@
+--TEST--\r
+Bug #47435 (FILTER_FLAG_NO_PRIV_RANGE and FILTER_FLAG_NO_RES_RANGE don't work with ipv6)\r
+--FILE--\r
+<?php\r
+var_dump(filter_var("FC00::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));\r
+var_dump(filter_var("FC00::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE));\r
+var_dump(filter_var("::", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));\r
+var_dump(filter_var("::", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));\r
+var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));\r
+var_dump(filter_var("::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));\r
+var_dump(filter_var("fe8:5:6::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));\r
+var_dump(filter_var("fe8:5:6::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));\r
+var_dump(filter_var("2001:0db8::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));\r
+var_dump(filter_var("2001:0db8::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));\r
+var_dump(filter_var("5f::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));\r
+var_dump(filter_var("5f::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));\r
+var_dump(filter_var("3ff3::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));\r
+var_dump(filter_var("3ff3::1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE));\r
+?>\r
+--EXPECT--     \r
+string(7) "FC00::1"\r
+bool(false)\r
+string(2) "::"\r
+bool(false)\r
+string(3) "::1"\r
+bool(false)\r
+string(10) "fe8:5:6::1"\r
+bool(false)\r
+string(12) "2001:0db8::1"\r
+bool(false)\r
+string(5) "5f::1"\r
+bool(false)\r
+string(7) "3ff3::1"\r
+bool(false)\r