diff --git a/ext/json/json.c b/ext/json/json.c index 04a62f52152f..b71b9aafe997 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -250,6 +250,11 @@ PHP_FUNCTION(json_encode) Z_PARAM_LONG(depth) ZEND_PARSE_PARAMETERS_END(); + if (ZEND_LONG_EXCEEDS_INT(depth)) { + zend_argument_value_error(3, "must be between %d and %d", INT_MIN, INT_MAX); + RETURN_THROWS(); + } + php_json_encode_init(&encoder); encoder.max_depth = (int)depth; php_json_encode_zval(&buf, parameter, (int)options, &encoder); diff --git a/ext/json/tests/json_encode_depth.phpt b/ext/json/tests/json_encode_depth.phpt new file mode 100644 index 000000000000..075228da472c --- /dev/null +++ b/ext/json/tests/json_encode_depth.phpt @@ -0,0 +1,19 @@ +--TEST-- +json_encode() rejects depth values outside the encoder range +--SKIPIF-- + +--FILE-- +getMessage(), "\n"; + } +} + +?> +--EXPECT-- +ValueError: json_encode(): Argument #3 ($depth) must be between -2147483648 and 2147483647 +ValueError: json_encode(): Argument #3 ($depth) must be between -2147483648 and 2147483647