@@ -969,15 +969,15 @@ static bool ipv6_get_status_flags(int ip[8], bool *global, bool *reserved, bool
969969 return true;
970970}
971971
972+ /* Validates an ipv4 or ipv6 IP, based on the flag (4, 6, or both) add a flag
973+ * to throw out reserved ranges; multicast ranges... etc. If both allow_ipv4
974+ * and allow_ipv6 flags flag are used, then the first dot or colon determine
975+ * the format */
972976void php_filter_validate_ip (PHP_INPUT_FILTER_PARAM_DECL ) /* {{{ */
973977{
974- /* validates an ipv4 or ipv6 IP, based on the flag (4, 6, or both) add a
975- * flag to throw out reserved ranges; multicast ranges... etc. If both
976- * allow_ipv4 and allow_ipv6 flags flag are used, then the first dot or
977- * colon determine the format */
978-
979- int ip [8 ];
980- int mode ;
978+ int ip [8 ];
979+ int mode ;
980+ bool flag_global , flag_reserved , flag_private ; /* flags for ranges as determined by RFC 6890 */
981981
982982 if (memchr (Z_STRVAL_P (value ), ':' , Z_STRLEN_P (value ))) {
983983 mode = FORMAT_IPV6 ;
@@ -995,63 +995,35 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
995995 RETURN_VALIDATION_FAILED
996996 }
997997
998- switch (mode ) {
999- case FORMAT_IPV4 :
1000- {
1001- if (!_php_filter_validate_ipv4 (Z_STRVAL_P (value ), Z_STRLEN_P (value ), ip )) {
1002- RETURN_VALIDATION_FAILED
1003- }
1004-
1005- /* Check flags */
1006- bool flag_global , flag_reserved , flag_private ;
1007- bool known_block = ipv4_get_status_flags (ip , & flag_global , & flag_reserved , & flag_private );
1008-
1009- if (!known_block ) {
1010- break ;
1011- }
1012-
1013- if ((flags & FILTER_FLAG_GLOBAL_RANGE ) && flag_global != true) {
1014- RETURN_VALIDATION_FAILED
1015- }
1016-
1017- if ((flags & FILTER_FLAG_NO_PRIV_RANGE ) && flag_private == true) {
1018- RETURN_VALIDATION_FAILED
1019- }
1020-
1021- if ((flags & FILTER_FLAG_NO_RES_RANGE ) && flag_reserved == true) {
1022- RETURN_VALIDATION_FAILED
1023- }
1024- }
1025- break ;
998+ if (mode == FORMAT_IPV4 ) {
999+ if (!_php_filter_validate_ipv4 (Z_STRVAL_P (value ), Z_STRLEN_P (value ), ip )) {
1000+ RETURN_VALIDATION_FAILED
1001+ }
10261002
1027- case FORMAT_IPV6 :
1028- {
1029- int res = 0 ;
1030- res = _php_filter_validate_ipv6 (Z_STRVAL_P (value ), Z_STRLEN_P (value ), ip );
1031- if (res < 1 ) {
1032- RETURN_VALIDATION_FAILED
1033- }
1034- /* Check flags */
1035- bool flag_global , flag_reserved , flag_private ;
1036- bool known_block = ipv6_get_status_flags (ip , & flag_global , & flag_reserved , & flag_private );
1003+ if (!ipv4_get_status_flags (ip , & flag_global , & flag_reserved , & flag_private )) {
1004+ return ; /* no special block */
1005+ }
1006+ }
1007+ else if (mode == FORMAT_IPV6 ) {
1008+ if (_php_filter_validate_ipv6 (Z_STRVAL_P (value ), Z_STRLEN_P (value ), ip ) < 1 ) {
1009+ RETURN_VALIDATION_FAILED
1010+ }
10371011
1038- if (!known_block ) {
1039- break ;
1040- }
1012+ if (!ipv6_get_status_flags (ip , & flag_global , & flag_reserved , & flag_private )) {
1013+ return ; /* no special block */
1014+ }
1015+ }
10411016
1042- if ((flags & FILTER_FLAG_GLOBAL_RANGE ) && flag_global != true) {
1043- RETURN_VALIDATION_FAILED
1044- }
1017+ if ((flags & FILTER_FLAG_GLOBAL_RANGE ) && flag_global != true) {
1018+ RETURN_VALIDATION_FAILED
1019+ }
10451020
1046- if ((flags & FILTER_FLAG_NO_PRIV_RANGE ) && flag_private == true) {
1047- RETURN_VALIDATION_FAILED
1048- }
1021+ if ((flags & FILTER_FLAG_NO_PRIV_RANGE ) && flag_private == true) {
1022+ RETURN_VALIDATION_FAILED
1023+ }
10491024
1050- if ((flags & FILTER_FLAG_NO_RES_RANGE ) && flag_reserved == true) {
1051- RETURN_VALIDATION_FAILED
1052- }
1053- }
1054- break ;
1025+ if ((flags & FILTER_FLAG_NO_RES_RANGE ) && flag_reserved == true) {
1026+ RETURN_VALIDATION_FAILED
10551027 }
10561028}
10571029/* }}} */
0 commit comments