Skip to content

Commit

Permalink
Unify handling of return values on validation failure and var not found
Browse files Browse the repository at this point in the history
  • Loading branch information
Ilia Alshanetsky committed Oct 17, 2006
1 parent 0ebfbfe commit c5d68cd
Show file tree
Hide file tree
Showing 17 changed files with 164 additions and 148 deletions.
53 changes: 45 additions & 8 deletions ext/filter/filter.c
Expand Up @@ -182,6 +182,7 @@ PHP_MINIT_FUNCTION(filter)
REGISTER_LONG_CONSTANT("FILTER_REQUIRE_SCALAR", FILTER_REQUIRE_SCALAR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILTER_REQUIRE_ARRAY", FILTER_REQUIRE_ARRAY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILTER_FORCE_ARRAY", FILTER_FORCE_ARRAY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILTER_NULL_ON_FAILURE", FILTER_NULL_ON_FAILURE, CONST_CS | CONST_PERSISTENT);

REGISTER_LONG_CONSTANT("FILTER_VALIDATE_INT", FILTER_VALIDATE_INT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILTER_VALIDATE_BOOLEAN", FILTER_VALIDATE_BOOLEAN, CONST_CS | CONST_PERSISTENT);
Expand Down Expand Up @@ -557,7 +558,11 @@ static void php_filter_call(zval **filtered, long filter, zval **filter_args, co
SEPARATE_ZVAL(filtered);
}
zval_dtor(*filtered);
ZVAL_FALSE(*filtered);
if (filter_flags & FILTER_NULL_ON_FAILURE) {
ZVAL_NULL(*filtered);
} else {
ZVAL_FALSE(*filtered);
}
return;
}
php_zval_filter_recursive(filtered, filter, filter_flags, options, charset, copy TSRMLS_CC);
Expand All @@ -568,7 +573,11 @@ static void php_filter_call(zval **filtered, long filter, zval **filter_args, co
SEPARATE_ZVAL(filtered);
}
zval_dtor(*filtered);
ZVAL_FALSE(*filtered);
if (filter_flags & FILTER_NULL_ON_FAILURE) {
ZVAL_NULL(*filtered);
} else {
ZVAL_FALSE(*filtered);
}
return;
}

Expand Down Expand Up @@ -650,13 +659,27 @@ PHP_FUNCTION(filter_input)
int var_len;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls|lZ", &fetch_from, &var, &var_len, &filter, &filter_args) == FAILURE) {
RETURN_FALSE;
return;
}

input = php_filter_get_storage(fetch_from TSRMLS_CC);

if (!input || !HASH_OF(input) || zend_hash_find(HASH_OF(input), var, var_len + 1, (void **)&tmp) != SUCCESS) {
RETURN_FALSE;
long filter_flags = 0;
zval **option;
if (filter_args) {
if (Z_TYPE_PP(filter_args) == IS_LONG) {
filter_flags = Z_LVAL_PP(filter_args);
} else if (Z_TYPE_PP(filter_args) == IS_ARRAY && zend_hash_find(HASH_OF(*filter_args), "flags", sizeof("flags"), (void **)&option) == SUCCESS) {
convert_to_long(*option);
filter_flags = Z_LVAL_PP(option);
}
}
if (filter_flags & FILTER_NULL_ON_FAILURE) {
RETURN_FALSE;
} else {
RETURN_NULL();
}
}

*return_value = **tmp;
Expand All @@ -675,7 +698,7 @@ PHP_FUNCTION(filter_var)
zval **filter_args = NULL, *data;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/|lZ", &data, &filter, &filter_args) == FAILURE) {
RETURN_FALSE;
return;
}

*return_value = *data;
Expand All @@ -694,13 +717,27 @@ PHP_FUNCTION(filter_input_array)
zval *array_input = NULL, **op = NULL;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|Z", &fetch_from, &op) == FAILURE) {
RETURN_FALSE;
return;
}

array_input = php_filter_get_storage(fetch_from TSRMLS_CC);

if (!array_input || !HASH_OF(array_input)) {
RETURN_FALSE;
long filter_flags = 0;
zval **option;
if (op) {
if (Z_TYPE_PP(op) == IS_LONG) {
filter_flags = Z_LVAL_PP(op);
} else if (Z_TYPE_PP(op) == IS_ARRAY && zend_hash_find(HASH_OF(*op), "flags", sizeof("flags"), (void **)&option) == SUCCESS) {
convert_to_long(*option);
filter_flags = Z_LVAL_PP(option);
}
}
if (filter_flags & FILTER_NULL_ON_FAILURE) {
RETURN_FALSE;
} else {
RETURN_NULL();
}
}

php_filter_array_handler(array_input, op, return_value TSRMLS_CC);
Expand All @@ -715,7 +752,7 @@ PHP_FUNCTION(filter_var_array)
zval *array_input = NULL, **op = NULL;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|Z", &array_input, &op) == FAILURE) {
RETURN_FALSE;
return;
}

php_filter_array_handler(array_input, op, return_value TSRMLS_CC);
Expand Down
1 change: 1 addition & 0 deletions ext/filter/filter_private.h
Expand Up @@ -27,6 +27,7 @@
#define FILTER_REQUIRE_SCALAR 0x2000000

#define FILTER_FORCE_ARRAY 0x4000000
#define FILTER_NULL_ON_FAILURE 0x8000000

#define FILTER_FLAG_ALLOW_OCTAL 0x0001
#define FILTER_FLAG_ALLOW_HEX 0x0002
Expand Down
106 changes: 42 additions & 64 deletions ext/filter/logical_filters.c
Expand Up @@ -55,6 +55,15 @@
#define FORMAT_IPV4 4
#define FORMAT_IPV6 6

#define RETURN_VALIDATION_FAILED \
zval_dtor(value); \
if (flags & FILTER_NULL_ON_FAILURE) { \
ZVAL_NULL(value); \
} else { \
ZVAL_FALSE(value); \
} \
return; \

static int php_filter_parse_int(const char *str, unsigned int str_len, long *ret TSRMLS_DC) { /* {{{ */
long ctx_value = 0;
long sign = 1;
Expand Down Expand Up @@ -176,9 +185,7 @@ void php_filter_int(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
len = Z_STRLEN_P(value);

if (len == 0) {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}

if (option_flags & FILTER_FLAG_ALLOW_OCTAL) {
Expand Down Expand Up @@ -216,8 +223,7 @@ void php_filter_int(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
}

if (error > 0 || (min_range_set && (ctx_value < min_range)) || (max_range_set && (ctx_value > max_range))) {
zval_dtor(value);
ZVAL_NULL(value);
RETURN_VALIDATION_FAILED
} else {
zval_dtor(value);
Z_TYPE_P(value) = IS_LONG;
Expand All @@ -236,9 +242,7 @@ void php_filter_boolean(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
if (len>0) {
PHP_FILTER_TRIM_DEFAULT(str, len, end);
} else {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}

/* returns true for "1", "true", "on" and "yes"
Expand All @@ -251,9 +255,15 @@ void php_filter_boolean(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
{
zval_dtor(value);
ZVAL_BOOL(value, 1);
} else {
} else if ((strncasecmp(str, "false", sizeof("false")) == 0) ||
(strncasecmp(str, "no", sizeof("no")) == 0) ||
(strncasecmp(str, "off", sizeof("off")) == 0) ||
(strncmp(str, "0", sizeof("0")) == 0))
{
zval_dtor(value);
ZVAL_BOOL(value, 0);
} else {
RETURN_VALIDATION_FAILED
}
}
/* }}} */
Expand Down Expand Up @@ -285,9 +295,7 @@ void php_filter_float(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
len = Z_STRLEN_P(value);

if (len < 1) {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}

str = Z_STRVAL_P(value);
Expand Down Expand Up @@ -424,8 +432,7 @@ void php_filter_float(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
return;

stateError:
zval_dtor(value);
ZVAL_NULL(value);
RETURN_VALIDATION_FAILED
}
/* }}} */

Expand All @@ -450,22 +457,18 @@ void php_filter_validate_regexp(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */

if (!regexp_set) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "'regexp' option missing");
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}

re = pcre_get_compiled_regex(regexp, &pcre_extra, &preg_options TSRMLS_CC);
if (!re) {
zval_dtor(value);
ZVAL_NULL(value);
RETURN_VALIDATION_FAILED
}
matches = pcre_exec(re, NULL, Z_STRVAL_P(value), Z_STRLEN_P(value), 0, 0, ovector, 3);

/* 0 means that the vector is too small to hold all the captured substring offsets */
if (matches < 0) {
zval_dtor(value);
ZVAL_NULL(value);
RETURN_VALIDATION_FAILED
}
}
/* }}} */
Expand All @@ -478,26 +481,17 @@ void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
url = php_url_parse_ex(Z_STRVAL_P(value), Z_STRLEN_P(value));

if (url == NULL) {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}

if ((flags & FILTER_FLAG_SCHEME_REQUIRED) && url->scheme == NULL) {
zval_dtor(value);
ZVAL_NULL(value);
}
if ((flags & FILTER_FLAG_HOST_REQUIRED) && url->host == NULL) {
zval_dtor(value);
ZVAL_NULL(value);
}
if ((flags & FILTER_FLAG_PATH_REQUIRED) && url->path == NULL) {
zval_dtor(value);
ZVAL_NULL(value);
}
if ((flags & FILTER_FLAG_QUERY_REQUIRED) && url->query == NULL) {
zval_dtor(value);
ZVAL_NULL(value);
if (
((flags & FILTER_FLAG_SCHEME_REQUIRED) && url->scheme == NULL) ||
((flags & FILTER_FLAG_HOST_REQUIRED) && url->host == NULL) ||
((flags & FILTER_FLAG_PATH_REQUIRED) && url->path == NULL) ||
((flags & FILTER_FLAG_QUERY_REQUIRED) && url->query == NULL)
) {
php_url_free(url);
RETURN_VALIDATION_FAILED
}
php_url_free(url);
}
Expand All @@ -517,15 +511,13 @@ void php_filter_validate_email(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */

re = pcre_get_compiled_regex((char *)regexp, &pcre_extra, &preg_options TSRMLS_CC);
if (!re) {
zval_dtor(value);
ZVAL_NULL(value);
RETURN_VALIDATION_FAILED
}
matches = pcre_exec(re, NULL, Z_STRVAL_P(value), Z_STRLEN_P(value), 0, 0, ovector, 3);

/* 0 means that the vector is too small to hold all the captured substring offsets */
if (matches < 0) {
zval_dtor(value);
ZVAL_NULL(value);
RETURN_VALIDATION_FAILED
}

}
Expand Down Expand Up @@ -766,29 +758,21 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
} else if (strchr(str, '.')) {
mode = FORMAT_IPV4;
} else {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}

if (flags & (FILTER_FLAG_IPV4 || FILTER_FLAG_IPV6)) {
/* Both formats are cool */
} else if ((flags & FILTER_FLAG_IPV4) && mode == FORMAT_IPV6) {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
} else if ((flags & FILTER_FLAG_IPV6) && mode == FORMAT_IPV4) {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}

switch (mode) {
case FORMAT_IPV4:
if (!_php_filter_validate_ipv4(str, ip TSRMLS_CC)) {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}

/* Check flags */
Expand All @@ -798,9 +782,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
(ip[0] == 172 && (ip[1] >= 16 && ip[1] <= 31)) ||
(ip[0] == 192 && ip[1] == 168)
) {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}
}

Expand All @@ -811,9 +793,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
(ip[0] == 192 && ip[1] == 0 && ip[2] == 2) ||
(ip[0] >= 224 && ip[0] <= 255)
) {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}
}
break;
Expand All @@ -823,9 +803,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
int res = 0;
res = _php_filter_validate_ipv6_(str TSRMLS_CC);
if (res < 1) {
zval_dtor(value);
ZVAL_NULL(value);
return;
RETURN_VALIDATION_FAILED
}
}
break;
Expand Down
16 changes: 8 additions & 8 deletions ext/filter/tests/010.phpt
Expand Up @@ -21,13 +21,13 @@ array(7) {
[1]=>
int(1)
[2]=>
NULL
bool(false)
[3]=>
int(-23234)
[4]=>
NULL
bool(false)
[5]=>
NULL
bool(false)
[6]=>
array(0) {
}
Expand All @@ -38,20 +38,20 @@ array(7) {
[1]=>
float(1.7)
[2]=>
NULL
bool(false)
[3]=>
float(-23234.123)
[4]=>
NULL
bool(false)
[5]=>
NULL
bool(false)
[6]=>
array(0) {
}
}

Warning: filter_var() expects parameter 2 to be long, array given in %s on line %d
bool(false)
Warning: filter_var() expects parameter 2 to be long, array given in /home4/php_dev/php52/ext/filter/tests/010.php on line 5
NULL
string(1) "1"
string(1) "1"
string(1) "1"
Expand Down

0 comments on commit c5d68cd

Please sign in to comment.