]> granicus.if.org Git - php/commitdiff
- MFH: Fixed bug #46973 (IPv6 address filter rejects valid address)
authorFelipe Pena <felipe@php.net>
Wed, 31 Dec 2008 15:03:18 +0000 (15:03 +0000)
committerFelipe Pena <felipe@php.net>
Wed, 31 Dec 2008 15:03:18 +0000 (15:03 +0000)
ext/filter/logical_filters.c
ext/filter/tests/bug46973.phpt [new file with mode: 0644]

index 05a8eaf7d3002ee4a576500efcf6debc37babf42..4e64aabfefeb5c5790e6d059f0bdb134086cadaf 100644 (file)
@@ -526,7 +526,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;
@@ -552,20 +552,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 (file)
index 0000000..c9c5ba4
--- /dev/null
@@ -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"