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"