Skip to content

Commit cc35cfd

Browse files
committed
Promote warnings to exceptions in ext/filter
Closes GH-5970
1 parent c557c41 commit cc35cfd

11 files changed

+102
-70
lines changed

ext/filter/callback_filter.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ void php_filter_callback(PHP_INPUT_FILTER_PARAM_DECL)
2323
int status;
2424

2525
if (!option_array || !zend_is_callable(option_array, 0, NULL)) {
26-
php_error_docref(NULL, E_WARNING, "First argument is expected to be a valid callback");
26+
zend_type_error("%s(): Option must be a valid callback", get_active_function_name());
2727
zval_ptr_dtor(value);
2828
ZVAL_NULL(value);
2929
return;

ext/filter/filter.c

+15-8
Original file line numberDiff line numberDiff line change
@@ -487,8 +487,8 @@ static zval *php_filter_get_storage(zend_long arg)/* {{{ */
487487
array_ptr = !Z_ISUNDEF(IF_G(env_array)) ? &IF_G(env_array) : &PG(http_globals)[TRACK_VARS_ENV];
488488
break;
489489
default:
490-
php_error_docref(NULL, E_WARNING, "Unknown source");
491-
break;
490+
zend_argument_value_error(1, "must be an INPUT_* constant");
491+
return NULL;
492492
}
493493

494494
if (array_ptr && Z_TYPE_P(array_ptr) != IS_ARRAY) {
@@ -512,6 +512,9 @@ PHP_FUNCTION(filter_has_var)
512512
}
513513

514514
array_ptr = php_filter_get_storage(arg);
515+
if (EG(exception)) {
516+
RETURN_THROWS();
517+
}
515518

516519
if (array_ptr && zend_hash_exists(Z_ARRVAL_P(array_ptr), var)) {
517520
RETURN_TRUE;
@@ -614,14 +617,12 @@ static void php_filter_array_handler(zval *input, zval *op, zval *return_value,
614617

615618
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(op), arg_key, arg_elm) {
616619
if (arg_key == NULL) {
617-
php_error_docref(NULL, E_WARNING, "Numeric keys are not allowed in the definition array");
618-
zval_ptr_dtor(return_value);
619-
RETURN_FALSE;
620+
zend_argument_type_error(2, "must contain only string keys");
621+
RETURN_THROWS();
620622
}
621623
if (ZSTR_LEN(arg_key) == 0) {
622-
php_error_docref(NULL, E_WARNING, "Empty keys are not allowed in the definition array");
623-
zval_ptr_dtor(return_value);
624-
RETURN_FALSE;
624+
zend_argument_value_error(2, "cannot contain empty keys");
625+
RETURN_THROWS();
625626
}
626627
if ((tmp = zend_hash_find(Z_ARRVAL_P(input), arg_key)) == NULL) {
627628
if (add_empty) {
@@ -658,6 +659,9 @@ PHP_FUNCTION(filter_input)
658659
}
659660

660661
input = php_filter_get_storage(fetch_from);
662+
if (EG(exception)) {
663+
RETURN_THROWS();
664+
}
661665

662666
if (!input || (tmp = zend_hash_find(Z_ARRVAL_P(input), var)) == NULL) {
663667
zend_long filter_flags = 0;
@@ -731,6 +735,9 @@ PHP_FUNCTION(filter_input_array)
731735
}
732736

733737
array_input = php_filter_get_storage(fetch_from);
738+
if (EG(exception)) {
739+
RETURN_THROWS();
740+
}
734741

735742
if (!array_input) {
736743
zend_long filter_flags = 0;

ext/filter/filter_private.h

+9-6
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,15 @@
9292
|| (id >= FILTER_VALIDATE_ALL && id <= FILTER_VALIDATE_LAST) \
9393
|| id == FILTER_CALLBACK)
9494

95-
#define RETURN_VALIDATION_FAILED \
96-
zval_ptr_dtor(value); \
97-
if (flags & FILTER_NULL_ON_FAILURE) { \
98-
ZVAL_NULL(value); \
99-
} else { \
100-
ZVAL_FALSE(value); \
95+
#define RETURN_VALIDATION_FAILED \
96+
if (EG(exception)) { \
97+
return; \
98+
} else if (flags & FILTER_NULL_ON_FAILURE) { \
99+
zval_ptr_dtor(value); \
100+
ZVAL_NULL(value); \
101+
} else { \
102+
zval_ptr_dtor(value); \
103+
ZVAL_FALSE(value); \
101104
} \
102105
return; \
103106

ext/filter/logical_filters.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ void php_filter_float(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
360360

361361
if (decimal_set) {
362362
if (decimal_len != 1) {
363-
php_error_docref(NULL, E_WARNING, "Decimal separator must be one char");
363+
zend_value_error("%s(): \"decimal\" option must be one character long", get_active_function_name());
364364
RETURN_VALIDATION_FAILED
365365
} else {
366366
dec_sep = *decimal;
@@ -371,7 +371,7 @@ void php_filter_float(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
371371

372372
if (thousand_set) {
373373
if (thousand_len < 1) {
374-
php_error_docref(NULL, E_WARNING, "Thousand separator must be at least one char");
374+
zend_value_error("%s(): \"thousand\" option cannot be empty", get_active_function_name());
375375
RETURN_VALIDATION_FAILED
376376
} else {
377377
tsd_sep = thousand;
@@ -472,7 +472,7 @@ void php_filter_validate_regexp(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
472472
FETCH_STR_OPTION(regexp, "regexp");
473473

474474
if (!regexp_set) {
475-
php_error_docref(NULL, E_WARNING, "'regexp' option missing");
475+
zend_value_error("%s(): \"regexp\" option is missing", get_active_function_name());
476476
RETURN_VALIDATION_FAILED
477477
}
478478

@@ -919,7 +919,7 @@ void php_filter_validate_mac(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
919919
FETCH_STRING_OPTION(exp_separator, "separator");
920920

921921
if (exp_separator_set && exp_separator_len != 1) {
922-
php_error_docref(NULL, E_WARNING, "Separator must be exactly one character long");
922+
zend_value_error("%s(): \"separator\" option must be one character long", get_active_function_name());
923923
RETURN_VALIDATION_FAILED;
924924
}
925925

ext/filter/tests/017.phpt

+7-5
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,19 @@ var_dump(filter_var("data", FILTER_VALIDATE_REGEXP, array("options"=>array("rege
1010
var_dump(filter_var("data", FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>'/^d(.*)/'))));
1111
var_dump(filter_var("data", FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>'/blah/'))));
1212
var_dump(filter_var("data", FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>'/\[/'))));
13-
var_dump(filter_var("data", FILTER_VALIDATE_REGEXP));
13+
try {
14+
filter_var("data", FILTER_VALIDATE_REGEXP);
15+
} catch (ValueError $exception) {
16+
echo $exception->getMessage() . "\n";
17+
}
1418

1519
echo "Done\n";
1620
?>
17-
--EXPECTF--
21+
--EXPECT--
1822
string(4) "data"
1923
bool(false)
2024
string(4) "data"
2125
bool(false)
2226
bool(false)
23-
24-
Warning: filter_var(): 'regexp' option missing in %s on line %d
25-
bool(false)
27+
filter_var(): "regexp" option is missing
2628
Done

ext/filter/tests/029.phpt

+21-12
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,24 @@ function test($var) {
1313
var_dump(filter_var("data", FILTER_CALLBACK, array("options"=>"test")));
1414
var_dump(filter_var("~!@#$%^&*()_QWERTYUIOPASDFGHJKLZXCVBNM<>>?\"}{:", FILTER_CALLBACK, array("options"=>"test")));
1515
var_dump(filter_var("", FILTER_CALLBACK, array("options"=>"test")));
16-
var_dump(filter_var("qwe", FILTER_CALLBACK, array("options"=>"no such func")));
17-
var_dump(filter_var("qwe", FILTER_CALLBACK, array("options"=>"")));
18-
var_dump(filter_var("qwe", FILTER_CALLBACK));
16+
17+
try {
18+
filter_var("qwe", FILTER_CALLBACK, array("options"=>"no such func"));
19+
} catch (TypeError $exception) {
20+
echo $exception->getMessage() . "\n";
21+
}
22+
23+
try {
24+
filter_var("qwe", FILTER_CALLBACK, array("options"=>""));
25+
} catch (TypeError $exception) {
26+
echo $exception->getMessage() . "\n";
27+
}
28+
29+
try {
30+
filter_var("qwe", FILTER_CALLBACK);
31+
} catch (TypeError $exception) {
32+
echo $exception->getMessage() . "\n";
33+
}
1934

2035
/* Simple class method callback */
2136
class test_class {
@@ -62,15 +77,9 @@ echo "Done\n";
6277
string(4) "DATA"
6378
string(46) "~!@#$%^&*()_QWERTYUIOPASDFGHJKLZXCVBNM<>>?"}{:"
6479
string(0) ""
65-
66-
Warning: filter_var(): First argument is expected to be a valid callback in %s on line %d
67-
NULL
68-
69-
Warning: filter_var(): First argument is expected to be a valid callback in %s on line %d
70-
NULL
71-
72-
Warning: filter_var(): First argument is expected to be a valid callback in %s on line %d
73-
NULL
80+
filter_var(): Option must be a valid callback
81+
filter_var(): Option must be a valid callback
82+
filter_var(): Option must be a valid callback
7483
string(4) "data"
7584
string(46) "~!@#$%^&*()_qwertyuiopasdfghjklzxcvbnm<>>?"}{:"
7685
string(0) ""

ext/filter/tests/031.phpt

+7-6
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,15 @@ $floats = array(
3333

3434
echo "\ncustom decimal:\n";
3535
foreach ($floats as $float => $dec) {
36-
$out = filter_var($float, FILTER_VALIDATE_FLOAT, array("options"=>array('decimal' => $dec)));
37-
var_dump($out);
36+
try {
37+
var_dump(filter_var($float, FILTER_VALIDATE_FLOAT, array("options"=>array('decimal' => $dec))));
38+
} catch (ValueError $exception) {
39+
echo $exception->getMessage() . "\n";
40+
}
3841
}
3942

4043
?>
41-
--EXPECTF--
44+
--EXPECT--
4245
float(1.234)
4346
float(1.234)
4447
float(1.234)
@@ -52,7 +55,5 @@ custom decimal:
5255
bool(false)
5356
float(1.234)
5457
float(1.234)
55-
56-
Warning: filter_var(): Decimal separator must be one char in %s on line %d
57-
bool(false)
58+
filter_var(): "decimal" option must be one character long
5859
bool(false)

ext/filter/tests/039.phpt

+13-10
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,16 @@ var_dump(filter_var_array(array(), array("var_name"=>-1)));
3030
var_dump(filter_var_array(array("var_name"=>""), array("var_name"=>-1)));
3131

3232
echo "-- (5)\n";
33-
var_dump(filter_var_array(array("var_name"=>""), array("var_name"=>-1, "asdas"=>"asdasd", "qwe"=>"rty", ""=>"")));
34-
var_dump(filter_var_array(array("asdas"=>"text"), array("var_name"=>-1, "asdas"=>"asdasd", "qwe"=>"rty", ""=>"")));
35-
33+
try {
34+
filter_var_array(array("var_name"=>""), array("var_name"=>-1, "asdas"=>"asdasd", "qwe"=>"rty", ""=>""));
35+
} catch (ValueError $exception) {
36+
echo $exception->getMessage() . "\n";
37+
}
38+
try {
39+
filter_var_array(array("asdas"=>"text"), array("var_name"=>-1, "asdas"=>"asdasd", "qwe"=>"rty", ""=>""));
40+
} catch (ValueError $exception) {
41+
echo $exception->getMessage() . "\n";
42+
}
3643

3744
$a = array(""=>""); $b = -1;
3845
var_dump(filter_var_array($a, $b));
@@ -48,7 +55,7 @@ var_dump($a, $b);
4855

4956
echo "Done\n";
5057
?>
51-
--EXPECTF--
58+
--EXPECT--
5259
-- (1)
5360
array(0) {
5461
}
@@ -86,12 +93,8 @@ array(1) {
8693
string(0) ""
8794
}
8895
-- (5)
89-
90-
Warning: filter_var_array(): Empty keys are not allowed in the definition array in %s on line %d
91-
bool(false)
92-
93-
Warning: filter_var_array(): Empty keys are not allowed in the definition array in %s on line %d
94-
bool(false)
96+
filter_var_array(): Argument #2 ($options) cannot contain empty keys
97+
filter_var_array(): Argument #2 ($options) cannot contain empty keys
9598
bool(false)
9699
array(1) {
97100
[""]=>

ext/filter/tests/040.phpt

+8-5
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,24 @@ var_dump(filter_has_var(INPUT_GET, "a"));
1616
var_dump(filter_has_var(INPUT_GET, "c"));
1717
var_dump(filter_has_var(INPUT_GET, "abc"));
1818
var_dump(filter_has_var(INPUT_GET, "cc"));
19-
var_dump(filter_has_var(-1, "cc"));
19+
try {
20+
filter_has_var(-1, "cc");
21+
} catch (ValueError $exception) {
22+
echo $exception->getMessage() . "\n";
23+
}
24+
2025
var_dump(filter_has_var(0, "cc"));
2126

2227
echo "Done\n";
2328
?>
24-
--EXPECTF--
29+
--EXPECT--
2530
bool(false)
2631
bool(true)
2732
bool(true)
2833
bool(true)
2934
bool(true)
3035
bool(false)
3136
bool(false)
32-
33-
Warning: filter_has_var(): Unknown source in %s on line %d
34-
bool(false)
37+
filter_has_var(): Argument #1 ($type) must be an INPUT_* constant
3538
bool(false)
3639
Done

ext/filter/tests/055.phpt

+8-8
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,16 @@ $values = Array(
2121
array("01-23-45-67-89-ab", array("options" => array("separator" => ""))),
2222
);
2323
foreach ($values as $value) {
24-
var_dump(filter_var($value[0], FILTER_VALIDATE_MAC, $value[1]));
24+
try {
25+
var_dump(filter_var($value[0], FILTER_VALIDATE_MAC, $value[1]));
26+
} catch (ValueError $exception) {
27+
echo $exception->getMessage() . "\n";
28+
}
2529
}
2630

2731
echo "Done\n";
2832
?>
29-
--EXPECTF--
33+
--EXPECT--
3034
string(17) "01-23-45-67-89-ab"
3135
string(17) "01-23-45-67-89-ab"
3236
bool(false)
@@ -39,10 +43,6 @@ string(17) "01:23:45:67:89:aB"
3943
bool(false)
4044
bool(false)
4145
string(14) "0123.4567.89ab"
42-
43-
Warning: filter_var(): Separator must be exactly one character long in %s055.php on line %d
44-
bool(false)
45-
46-
Warning: filter_var(): Separator must be exactly one character long in %s055.php on line %d
47-
bool(false)
46+
filter_var(): "separator" option must be one character long
47+
filter_var(): "separator" option must be one character long
4848
Done

ext/filter/tests/bug51368.phpt

+9-5
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@ var_dump(
1212
filter_var('1 234.567', FILTER_VALIDATE_FLOAT, $options)
1313
);
1414
$options = ['flags' => FILTER_FLAG_ALLOW_THOUSAND, 'options' => ['thousand' => '']];
15-
var_dump(filter_var('12345', FILTER_VALIDATE_FLOAT, $options));
15+
16+
try {
17+
filter_var('12345', FILTER_VALIDATE_FLOAT, $options);
18+
} catch (ValueError $exception) {
19+
echo $exception->getMessage() . "\n";
20+
}
21+
1622
?>
17-
--EXPECTF--
23+
--EXPECT--
1824
float(1000)
1925
float(1234.567)
20-
21-
Warning: filter_var(): Thousand separator must be at least one char in %s on line %d
22-
bool(false)
26+
filter_var(): "thousand" option cannot be empty

0 commit comments

Comments
 (0)