diff options
author | Lars Strojny <lstrojny@php.net> | 2012-09-02 22:11:47 +0200 |
---|---|---|
committer | Lars Strojny <lstrojny@php.net> | 2012-09-02 22:11:47 +0200 |
commit | 6fc2962b9aa1aa8fe41400f2a895a09a16034e8c (patch) | |
tree | 5f9fb42a7a1f228ea0ebc5e8feb8e506730d153d | |
parent | cdb9fe99c2baac94a3106b8c6f947f0f5145a8b1 (diff) | |
parent | a26390ef0c22be3637795d9b5ab1c445e1d3f847 (diff) | |
download | php-git-6fc2962b9aa1aa8fe41400f2a895a09a16034e8c.tar.gz |
Merge branch 'PHP-5.4'
-rw-r--r-- | ext/filter/filter_private.h | 6 | ||||
-rw-r--r-- | ext/filter/logical_filters.c | 7 | ||||
-rw-r--r-- | ext/filter/tests/bug49510.phpt | 36 |
3 files changed, 45 insertions, 4 deletions
diff --git a/ext/filter/filter_private.h b/ext/filter/filter_private.h index daa688b4ac..2ec2f62fae 100644 --- a/ext/filter/filter_private.h +++ b/ext/filter/filter_private.h @@ -99,12 +99,14 @@ } \ return; \ -#define PHP_FILTER_TRIM_DEFAULT(p, len) { \ +#define PHP_FILTER_TRIM_DEFAULT(p, len) PHP_FILTER_TRIM_DEFAULT_EX(p, len, 1); + +#define PHP_FILTER_TRIM_DEFAULT_EX(p, len, return_if_empty) { \ while ((len > 0) && (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\v' || *p == '\n')) { \ p++; \ len--; \ } \ - if (len < 1) { \ + if (len < 1 && return_if_empty) { \ RETURN_VALIDATION_FAILED \ } \ while (p[len-1] == ' ' || p[len-1] == '\t' || p[len-1] == '\r' || p[len-1] == '\v' || p[len-1] == '\n') { \ diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 5c3811ab25..4de6b83e00 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -235,12 +235,15 @@ void php_filter_boolean(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ int len = Z_STRLEN_P(value); int ret; - PHP_FILTER_TRIM_DEFAULT(str, len); + PHP_FILTER_TRIM_DEFAULT_EX(str, len, 0); /* returns true for "1", "true", "on" and "yes" * returns false for "0", "false", "off", "no", and "" * null otherwise. */ switch (len) { + case 0: + ret = 0; + break; case 1: if (*str == '1') { ret = 1; @@ -286,7 +289,7 @@ void php_filter_boolean(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ ret = -1; } - if (ret == -1) { + if (ret == -1) { RETURN_VALIDATION_FAILED } else { zval_dtor(value); diff --git a/ext/filter/tests/bug49510.phpt b/ext/filter/tests/bug49510.phpt new file mode 100644 index 0000000000..3f365cc431 --- /dev/null +++ b/ext/filter/tests/bug49510.phpt @@ -0,0 +1,36 @@ +--TEST-- +#49510 boolean validation fails with FILTER_NULL_ON_FAILURE +--FILE-- +<?php +var_dump(filter_var(false, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var(0, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var("0", FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var("off", FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var("", FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var("false", FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var("no", FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); + +var_dump(filter_var(true, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var(1, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var("1", FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var("on", FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +var_dump(filter_var("yes", FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); + +var_dump(filter_var("invalid", FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); +?> +==DONE== +--EXPECT-- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +NULL +==DONE== |