@@ -969,15 +969,15 @@ static bool ipv6_get_status_flags(int ip[8], bool *global, bool *reserved, bool
969
969
return true;
970
970
}
971
971
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 */
972
976
void php_filter_validate_ip (PHP_INPUT_FILTER_PARAM_DECL ) /* {{{ */
973
977
{
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 */
981
981
982
982
if (memchr (Z_STRVAL_P (value ), ':' , Z_STRLEN_P (value ))) {
983
983
mode = FORMAT_IPV6 ;
@@ -995,63 +995,35 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
995
995
RETURN_VALIDATION_FAILED
996
996
}
997
997
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
+ }
1026
1002
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
+ }
1037
1011
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
+ }
1041
1016
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
+ }
1045
1020
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
+ }
1049
1024
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
1055
1027
}
1056
1028
}
1057
1029
/* }}} */
0 commit comments