diff options
Diffstat (limited to 'ext/json')
-rw-r--r-- | ext/json/JSON_parser.h | 5 | ||||
-rw-r--r-- | ext/json/json.c | 80 | ||||
-rw-r--r-- | ext/json/php_json.h | 2 | ||||
-rw-r--r-- | ext/json/tests/003.phpt | 17 | ||||
-rw-r--r-- | ext/json/tests/004.phpt | 16 | ||||
-rw-r--r-- | ext/json/tests/007.phpt | 16 | ||||
-rw-r--r-- | ext/json/tests/bug43941.phpt | 7 | ||||
-rw-r--r-- | ext/json/tests/bug53946.phpt | 6 | ||||
-rw-r--r-- | ext/json/tests/bug54058.phpt | 13 | ||||
-rw-r--r-- | ext/json/tests/bug61537.phpt | 39 | ||||
-rw-r--r-- | ext/json/tests/bug61978.phpt | 10 | ||||
-rw-r--r-- | ext/json/tests/bug62369.phpt | 34 | ||||
-rw-r--r-- | ext/json/tests/inf_nan_error.phpt | 45 | ||||
-rw-r--r-- | ext/json/tests/json_encode_basic.phpt | 6 | ||||
-rw-r--r-- | ext/json/tests/json_encode_error.phpt | 4 | ||||
-rw-r--r-- | ext/json/tests/pass001.1.phpt | 4 | ||||
-rw-r--r-- | ext/json/tests/pass001.1_64bit.phpt | 4 | ||||
-rw-r--r-- | ext/json/tests/pass001.phpt | 4 | ||||
-rw-r--r-- | ext/json/tests/unsupported_type_error.phpt | 26 |
19 files changed, 282 insertions, 56 deletions
diff --git a/ext/json/JSON_parser.h b/ext/json/JSON_parser.h index 541664b8c6..8671765b4d 100644 --- a/ext/json/JSON_parser.h +++ b/ext/json/JSON_parser.h @@ -25,7 +25,10 @@ enum error_codes { PHP_JSON_ERROR_STATE_MISMATCH, PHP_JSON_ERROR_CTRL_CHAR, PHP_JSON_ERROR_SYNTAX, - PHP_JSON_ERROR_UTF8 + PHP_JSON_ERROR_UTF8, + PHP_JSON_ERROR_RECURSION, + PHP_JSON_ERROR_INF_OR_NAN, + PHP_JSON_ERROR_UNSUPPORTED_TYPE }; extern JSON_parser new_JSON_parser(int depth); diff --git a/ext/json/json.c b/ext/json/json.c index b3240e1b4b..6b66dce3df 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -35,6 +35,7 @@ static PHP_MINFO_FUNCTION(json); static PHP_FUNCTION(json_encode); static PHP_FUNCTION(json_decode); static PHP_FUNCTION(json_last_error); +static PHP_FUNCTION(json_last_error_msg); static const char digits[] = "0123456789abcdef"; @@ -46,6 +47,7 @@ ZEND_DECLARE_MODULE_GLOBALS(json) ZEND_BEGIN_ARG_INFO_EX(arginfo_json_encode, 0, 0, 1) ZEND_ARG_INFO(0, value) ZEND_ARG_INFO(0, options) + ZEND_ARG_INFO(0, depth) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_json_decode, 0, 0, 1) @@ -57,6 +59,9 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO(arginfo_json_last_error, 0) ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO(arginfo_json_last_error_msg, 0) +ZEND_END_ARG_INFO() /* }}} */ /* {{{ json_functions[] */ @@ -64,6 +69,7 @@ static const zend_function_entry json_functions[] = { PHP_FE(json_encode, arginfo_json_encode) PHP_FE(json_decode, arginfo_json_decode) PHP_FE(json_last_error, arginfo_json_last_error) + PHP_FE(json_last_error_msg, arginfo_json_last_error_msg) PHP_FE_END }; /* }}} */ @@ -96,6 +102,7 @@ static PHP_MINIT_FUNCTION(json) REGISTER_LONG_CONSTANT("JSON_UNESCAPED_SLASHES", PHP_JSON_UNESCAPED_SLASHES, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("JSON_PRETTY_PRINT", PHP_JSON_PRETTY_PRINT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("JSON_UNESCAPED_UNICODE", PHP_JSON_UNESCAPED_UNICODE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("JSON_PARTIAL_OUTPUT_ON_ERROR", PHP_JSON_PARTIAL_OUTPUT_ON_ERROR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("JSON_ERROR_NONE", PHP_JSON_ERROR_NONE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("JSON_ERROR_DEPTH", PHP_JSON_ERROR_DEPTH, CONST_CS | CONST_PERSISTENT); @@ -103,6 +110,9 @@ static PHP_MINIT_FUNCTION(json) REGISTER_LONG_CONSTANT("JSON_ERROR_CTRL_CHAR", PHP_JSON_ERROR_CTRL_CHAR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("JSON_ERROR_SYNTAX", PHP_JSON_ERROR_SYNTAX, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("JSON_ERROR_UTF8", PHP_JSON_ERROR_UTF8, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("JSON_ERROR_RECURSION", PHP_JSON_ERROR_RECURSION, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("JSON_ERROR_INF_OR_NAN", PHP_JSON_ERROR_INF_OR_NAN, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("JSON_ERROR_UNSUPPORTED_TYPE", PHP_JSON_ERROR_UNSUPPORTED_TYPE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("JSON_OBJECT_AS_ARRAY", PHP_JSON_OBJECT_AS_ARRAY, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("JSON_BIGINT_AS_STRING", PHP_JSON_BIGINT_AS_STRING, CONST_CS | CONST_PERSISTENT); @@ -117,6 +127,7 @@ static PHP_GINIT_FUNCTION(json) { json_globals->encoder_depth = 0; json_globals->error_code = 0; + json_globals->encode_max_depth = 0; } /* }}} */ @@ -174,7 +185,7 @@ static int json_determine_array_type(zval **val TSRMLS_DC) /* {{{ */ idx = 0; for (;; zend_hash_move_forward_ex(myht, &pos)) { i = zend_hash_get_current_key_ex(myht, &key, &key_len, &index, 0, &pos); - if (i == HASH_KEY_NON_EXISTANT) { + if (i == HASH_KEY_NON_EXISTENT) { break; } @@ -231,7 +242,7 @@ static void json_encode_array(smart_str *buf, zval **val, int options TSRMLS_DC) } if (myht && myht->nApplyCount > 1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected"); + JSON_G(error_code) = PHP_JSON_ERROR_RECURSION; smart_str_appendl(buf, "null", 4); return; } @@ -258,7 +269,7 @@ static void json_encode_array(smart_str *buf, zval **val, int options TSRMLS_DC) zend_hash_internal_pointer_reset_ex(myht, &pos); for (;; zend_hash_move_forward_ex(myht, &pos)) { i = zend_hash_get_current_key_ex(myht, &key, &key_len, &index, 0, &pos); - if (i == HASH_KEY_NON_EXISTANT) + if (i == HASH_KEY_NON_EXISTENT) break; if (zend_hash_get_current_data_ex(myht, (void **) &data, &pos) == SUCCESS) { @@ -330,6 +341,9 @@ static void json_encode_array(smart_str *buf, zval **val, int options TSRMLS_DC) } } + if (JSON_G(encoder_depth) > JSON_G(encode_max_depth)) { + JSON_G(error_code) = PHP_JSON_ERROR_DEPTH; + } --JSON_G(encoder_depth); /* Only keep closing bracket on same line for empty arrays/objects */ @@ -411,7 +425,7 @@ static void json_escape_string(smart_str *buf, char *s, int len, int options TSR smart_str_appendl(buf, tmp, l); efree(tmp); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "double %.9g does not conform to the JSON spec, encoded as 0", d); + JSON_G(error_code) = PHP_JSON_ERROR_INF_OR_NAN; smart_str_appendc(buf, '0'); } } @@ -428,9 +442,6 @@ static void json_escape_string(smart_str *buf, char *s, int len, int options TSR } if (ulen < 0) { JSON_G(error_code) = PHP_JSON_ERROR_UTF8; - if (!PG(display_errors)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid UTF-8 sequence in argument"); - } smart_str_appendl(buf, "null", 4); } else { smart_str_appendl(buf, "\"\"", 2); @@ -558,7 +569,7 @@ static void json_encode_serializable_object(smart_str *buf, zval *val, int optio } if (myht && myht->nApplyCount > 1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected"); + JSON_G(error_code) = PHP_JSON_ERROR_RECURSION; smart_str_appendl(buf, "null", 4); return; } @@ -622,7 +633,7 @@ PHP_JSON_API void php_json_encode(smart_str *buf, zval *val, int options TSRMLS_ smart_str_appendl(buf, d, len); efree(d); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "double %.9g does not conform to the JSON spec, encoded as 0", dbl); + JSON_G(error_code) = PHP_JSON_ERROR_INF_OR_NAN; smart_str_appendc(buf, '0'); } } @@ -643,7 +654,7 @@ PHP_JSON_API void php_json_encode(smart_str *buf, zval *val, int options TSRMLS_ break; default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "type is unsupported, encoded as null"); + JSON_G(error_code) = PHP_JSON_ERROR_UNSUPPORTED_TYPE; smart_str_appendl(buf, "null", 4); break; } @@ -761,23 +772,30 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len, /* }}} */ -/* {{{ proto string json_encode(mixed data [, int options]) +/* {{{ proto string json_encode(mixed data [, int options[, int depth]]) Returns the JSON representation of a value */ static PHP_FUNCTION(json_encode) { zval *parameter; smart_str buf = {0}; long options = 0; + long depth = JSON_PARSER_DEFAULT_DEPTH; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", ¶meter, &options) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|ll", ¶meter, &options, &depth) == FAILURE) { return; } JSON_G(error_code) = PHP_JSON_ERROR_NONE; + JSON_G(encode_max_depth) = depth; + php_json_encode(&buf, parameter, options TSRMLS_CC); - ZVAL_STRINGL(return_value, buf.c, buf.len, 1); + if (JSON_G(error_code) != PHP_JSON_ERROR_NONE && !(options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR)) { + ZVAL_FALSE(return_value); + } else { + ZVAL_STRINGL(return_value, buf.c, buf.len, 1); + } smart_str_free(&buf); } @@ -815,7 +833,7 @@ static PHP_FUNCTION(json_decode) /* }}} */ /* {{{ proto int json_last_error() - Returns the error code of the last json_decode(). */ + Returns the error code of the last json_encode() or json_decode() call. */ static PHP_FUNCTION(json_last_error) { if (zend_parse_parameters_none() == FAILURE) { @@ -826,6 +844,40 @@ static PHP_FUNCTION(json_last_error) } /* }}} */ +/* {{{ proto string json_last_error_msg() + Returns the error string of the last json_encode() or json_decode() call. */ +static PHP_FUNCTION(json_last_error_msg) +{ + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + switch(JSON_G(error_code)) { + case PHP_JSON_ERROR_NONE: + RETURN_STRING("No error", 1); + case PHP_JSON_ERROR_DEPTH: + RETURN_STRING("Maximum stack depth exceeded", 1); + case PHP_JSON_ERROR_STATE_MISMATCH: + RETURN_STRING("State mismatch (invalid or malformed JSON)", 1); + case PHP_JSON_ERROR_CTRL_CHAR: + RETURN_STRING("Control character error, possibly incorrectly encoded", 1); + case PHP_JSON_ERROR_SYNTAX: + RETURN_STRING("Syntax error", 1); + case PHP_JSON_ERROR_UTF8: + RETURN_STRING("Malformed UTF-8 characters, possibly incorrectly encoded", 1); + case PHP_JSON_ERROR_RECURSION: + RETURN_STRING("Recursion detected", 1); + case PHP_JSON_ERROR_INF_OR_NAN: + RETURN_STRING("Inf and NaN cannot be JSON encoded", 1); + case PHP_JSON_ERROR_UNSUPPORTED_TYPE: + RETURN_STRING("Type is not supported", 1); + default: + RETURN_STRING("Unknown error", 1); + } + +} +/* }}} */ + /* * Local variables: * tab-width: 4 diff --git a/ext/json/php_json.h b/ext/json/php_json.h index 9ad2ecab6b..e00de6a27b 100644 --- a/ext/json/php_json.h +++ b/ext/json/php_json.h @@ -40,6 +40,7 @@ extern zend_module_entry json_module_entry; ZEND_BEGIN_MODULE_GLOBALS(json) int encoder_depth; int error_code; + int encode_max_depth; ZEND_END_MODULE_GLOBALS(json) #ifdef ZTS @@ -63,6 +64,7 @@ extern PHP_JSON_API zend_class_entry *php_json_serializable_ce; #define PHP_JSON_UNESCAPED_SLASHES (1<<6) #define PHP_JSON_PRETTY_PRINT (1<<7) #define PHP_JSON_UNESCAPED_UNICODE (1<<8) +#define PHP_JSON_PARTIAL_OUTPUT_ON_ERROR (1<<9) /* Internal flags */ #define PHP_JSON_OUTPUT_ARRAY 0 diff --git a/ext/json/tests/003.phpt b/ext/json/tests/003.phpt index 3b52fb0884..4ce5b0fde9 100644 --- a/ext/json/tests/003.phpt +++ b/ext/json/tests/003.phpt @@ -9,10 +9,16 @@ $a = array(); $a[] = &$a; var_dump($a); + +echo "\n"; + var_dump(json_encode($a)); +var_dump(json_last_error(), json_last_error_msg()); -/* Break circular data structure to prevent memory leaks */ -unset($a[0]); +echo "\n"; + +var_dump(json_encode($a, JSON_PARTIAL_OUTPUT_ON_ERROR)); +var_dump(json_last_error(), json_last_error_msg()); echo "Done\n"; ?> @@ -25,6 +31,11 @@ array(1) { } } -Warning: json_encode(): recursion detected in %s on line %d +bool(false) +int(6) +string(%d) "Recursion detected" + string(8) "[[null]]" +int(6) +string(%d) "Recursion detected" Done diff --git a/ext/json/tests/004.phpt b/ext/json/tests/004.phpt index 1d282f9a96..70ef3ffd1b 100644 --- a/ext/json/tests/004.phpt +++ b/ext/json/tests/004.phpt @@ -9,7 +9,16 @@ $a = new stdclass; $a->prop = $a; var_dump($a); + +echo "\n"; + var_dump(json_encode($a)); +var_dump(json_last_error(), json_last_error_msg()); + +echo "\n"; + +var_dump(json_encode($a, JSON_PARTIAL_OUTPUT_ON_ERROR)); +var_dump(json_last_error(), json_last_error_msg()); echo "Done\n"; ?> @@ -19,6 +28,11 @@ object(stdClass)#%d (1) { *RECURSION* } -Warning: json_encode(): recursion detected in %s on line %d +bool(false) +int(6) +string(%d) "Recursion detected" + string(22) "{"prop":{"prop":null}}" +int(6) +string(%d) "Recursion detected" Done diff --git a/ext/json/tests/007.phpt b/ext/json/tests/007.phpt index 9ee190a24c..7557ac9ed7 100644 --- a/ext/json/tests/007.phpt +++ b/ext/json/tests/007.phpt @@ -5,15 +5,15 @@ json_last_error() tests --FILE-- <?php var_dump(json_decode("[1]")); -var_dump(json_last_error()); +var_dump(json_last_error(), json_last_error_msg()); var_dump(json_decode("[[1]]", false, 2)); -var_dump(json_last_error()); +var_dump(json_last_error(), json_last_error_msg()); var_dump(json_decode("[1}")); -var_dump(json_last_error()); +var_dump(json_last_error(), json_last_error_msg()); var_dump(json_decode('["' . chr(0) . 'abcd"]')); -var_dump(json_last_error()); +var_dump(json_last_error(), json_last_error_msg()); var_dump(json_decode("[1")); -var_dump(json_last_error()); +var_dump(json_last_error(), json_last_error_msg()); echo "Done\n"; @@ -24,13 +24,17 @@ array(1) { int(1) } int(0) +string(8) "No error" NULL int(1) +string(28) "Maximum stack depth exceeded" NULL int(2) +string(42) "State mismatch (invalid or malformed JSON)" NULL int(3) +string(53) "Control character error, possibly incorrectly encoded" NULL int(4) +string(12) "Syntax error" Done - diff --git a/ext/json/tests/bug43941.phpt b/ext/json/tests/bug43941.phpt index 0f86d1dfad..48bd7ad524 100644 --- a/ext/json/tests/bug43941.phpt +++ b/ext/json/tests/bug43941.phpt @@ -7,15 +7,14 @@ Bug #43941 (json_encode() invalid UTF-8) var_dump(json_encode("abc")); var_dump(json_encode("ab\xE0")); -var_dump(json_encode("ab\xE0c")); -var_dump(json_encode(array("ab\xE0", "ab\xE0c", "abc"))); +var_dump(json_encode("ab\xE0", JSON_PARTIAL_OUTPUT_ON_ERROR)); +var_dump(json_encode(array("ab\xE0", "ab\xE0c", "abc"), JSON_PARTIAL_OUTPUT_ON_ERROR)); echo "Done\n"; ?> --EXPECTF-- string(5) ""abc"" -string(4) "null" +bool(false) string(4) "null" string(17) "[null,null,"abc"]" Done - diff --git a/ext/json/tests/bug53946.phpt b/ext/json/tests/bug53946.phpt index abbb81238b..111438ddc4 100644 --- a/ext/json/tests/bug53946.phpt +++ b/ext/json/tests/bug53946.phpt @@ -9,8 +9,8 @@ var_dump(json_encode("latin 1234 -/ russian мама мыла раму speci var_dump(json_encode("ab\xE0")); var_dump(json_encode("ab\xE0", JSON_UNESCAPED_UNICODE)); ?> ---EXPECT-- +--EXPECTF-- string(156) ""latin 1234 -\/ russian \u043c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443 specialchars \u0002 \b \n U+1D11E >\ud834\udd1e<"" string(100) ""latin 1234 -\/ russian мама мыла раму specialchars \u0002 \b \n U+1D11E >𝄞<"" -string(4) "null" -string(4) "null" +bool(false) +bool(false) diff --git a/ext/json/tests/bug54058.phpt b/ext/json/tests/bug54058.phpt index 3b1136bdd9..df1b3130f8 100644 --- a/ext/json/tests/bug54058.phpt +++ b/ext/json/tests/bug54058.phpt @@ -8,28 +8,33 @@ Bug #54058 (json_last_error() invalid UTF-8 produces wrong error) $bad_utf8 = quoted_printable_decode('=B0'); json_encode($bad_utf8); -var_dump(json_last_error()); +var_dump(json_last_error(), json_last_error_msg()); $a = new stdclass; $a->foo = quoted_printable_decode('=B0'); json_encode($a); -var_dump(json_last_error()); +var_dump(json_last_error(), json_last_error_msg()); $b = new stdclass; $b->foo = $bad_utf8; $b->bar = 1; json_encode($b); -var_dump(json_last_error()); +var_dump(json_last_error(), json_last_error_msg()); $c = array( 'foo' => $bad_utf8, 'bar' => 1 ); json_encode($c); -var_dump(json_last_error()); +var_dump(json_last_error(), json_last_error_msg()); + ?> --EXPECTF-- int(5) +string(56) "Malformed UTF-8 characters, possibly incorrectly encoded" int(5) +string(56) "Malformed UTF-8 characters, possibly incorrectly encoded" int(5) +string(56) "Malformed UTF-8 characters, possibly incorrectly encoded" int(5) +string(56) "Malformed UTF-8 characters, possibly incorrectly encoded" diff --git a/ext/json/tests/bug61537.phpt b/ext/json/tests/bug61537.phpt new file mode 100644 index 0000000000..80ed051c9a --- /dev/null +++ b/ext/json/tests/bug61537.phpt @@ -0,0 +1,39 @@ +--TEST-- +Bug #61537 (json_encode() incorrectly truncates/discards information) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +$invalid_utf8 = "\x9f"; + +var_dump(json_encode($invalid_utf8)); +var_dump(json_last_error(), json_last_error_msg()); + +var_dump(json_encode($invalid_utf8, JSON_PARTIAL_OUTPUT_ON_ERROR)); +var_dump(json_last_error(), json_last_error_msg()); + +echo "\n"; + +$invalid_utf8 = "an invalid sequen\xce in the middle of a string"; + +var_dump(json_encode($invalid_utf8)); +var_dump(json_last_error(), json_last_error_msg()); + +var_dump(json_encode($invalid_utf8, JSON_PARTIAL_OUTPUT_ON_ERROR)); +var_dump(json_last_error(), json_last_error_msg()); + +?> +--EXPECTF-- +bool(false) +int(5) +string(56) "Malformed UTF-8 characters, possibly incorrectly encoded" +string(4) "null" +int(5) +string(56) "Malformed UTF-8 characters, possibly incorrectly encoded" + +bool(false) +int(5) +string(56) "Malformed UTF-8 characters, possibly incorrectly encoded" +string(4) "null" +int(5) +string(56) "Malformed UTF-8 characters, possibly incorrectly encoded" diff --git a/ext/json/tests/bug61978.phpt b/ext/json/tests/bug61978.phpt index 2c732979ef..c34b03f8f7 100644 --- a/ext/json/tests/bug61978.phpt +++ b/ext/json/tests/bug61978.phpt @@ -29,19 +29,15 @@ class JsonTest2 implements JsonSerializable { $obj1 = new JsonTest1(); -var_dump(json_encode($obj1)); +var_dump(json_encode($obj1, JSON_PARTIAL_OUTPUT_ON_ERROR)); -echo "\n==\n"; +echo "==\n"; $obj2 = new JsonTest2(); -var_dump(json_encode($obj2)); +var_dump(json_encode($obj2, JSON_PARTIAL_OUTPUT_ON_ERROR)); ?> --EXPECTF-- -Warning: json_encode(): recursion detected in %s on line %d string(44) "{"test":"123","me":{"test":"123","me":null}}" - == - -Warning: json_encode(): recursion detected in %s on line %d string(44) "{"test":"123","me":{"test":"123","me":null}}" diff --git a/ext/json/tests/bug62369.phpt b/ext/json/tests/bug62369.phpt new file mode 100644 index 0000000000..a5efd802c5 --- /dev/null +++ b/ext/json/tests/bug62369.phpt @@ -0,0 +1,34 @@ +--TEST-- +FR #62369 (Segfault on json_encode(deeply_nested_array) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +$array = array(); +for ($i=0; $i<550; $i++) { + $array = array($array); +} + +json_encode($array, 0, 551); +switch (json_last_error()) { + case JSON_ERROR_NONE: + echo 'OK'.PHP_EOL; + break; + case JSON_ERROR_DEPTH: + echo 'ERROR'.PHP_EOL; + break; +} + +json_encode($array, 0, 540); +switch (json_last_error()) { + case JSON_ERROR_NONE: + echo 'OK'.PHP_EOL; + break; + case JSON_ERROR_DEPTH: + echo 'ERROR'.PHP_EOL; + break; +} +--EXPECTF-- +OK +ERROR diff --git a/ext/json/tests/inf_nan_error.phpt b/ext/json/tests/inf_nan_error.phpt new file mode 100644 index 0000000000..f9deecc469 --- /dev/null +++ b/ext/json/tests/inf_nan_error.phpt @@ -0,0 +1,45 @@ +--TEST-- +An error is thrown when INF or NaN are encoded +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +$inf = INF; + +var_dump($inf); + +var_dump(json_encode($inf)); +var_dump(json_last_error(), json_last_error_msg()); + +var_dump(json_encode($inf, JSON_PARTIAL_OUTPUT_ON_ERROR)); +var_dump(json_last_error(), json_last_error_msg()); + +echo "\n"; + +$nan = NAN; + +var_dump($nan); + +var_dump(json_encode($nan)); +var_dump(json_last_error(), json_last_error_msg()); + +var_dump(json_encode($nan, JSON_PARTIAL_OUTPUT_ON_ERROR)); +var_dump(json_last_error(), json_last_error_msg()); +?> +--EXPECTF-- +float(INF) +bool(false) +int(7) +string(34) "Inf and NaN cannot be JSON encoded" +string(1) "0" +int(7) +string(34) "Inf and NaN cannot be JSON encoded" + +float(NAN) +bool(false) +int(7) +string(34) "Inf and NaN cannot be JSON encoded" +string(1) "0" +int(7) +string(34) "Inf and NaN cannot be JSON encoded" diff --git a/ext/json/tests/json_encode_basic.phpt b/ext/json/tests/json_encode_basic.phpt index 152e24444c..fc348eed81 100644 --- a/ext/json/tests/json_encode_basic.phpt +++ b/ext/json/tests/json_encode_basic.phpt @@ -150,9 +150,7 @@ string(4) "null" -- Iteration 25 -- string(4) "null" -- Iteration 26 -- - -Warning: json_encode(): type is unsupported, encoded as null in %s on line %d -string(4) "null" +bool(false) -- Iteration 27 -- string(82) "{"MyInt":99,"MyFloat":123.45,"MyBool":true,"MyNull":null,"MyString":"Hello World"}" -===Done===
\ No newline at end of file +===Done=== diff --git a/ext/json/tests/json_encode_error.phpt b/ext/json/tests/json_encode_error.phpt index d130dd960c..547c8bef17 100644 --- a/ext/json/tests/json_encode_error.phpt +++ b/ext/json/tests/json_encode_error.phpt @@ -34,7 +34,5 @@ Warning: json_encode() expects at least 1 parameter, 0 given in %s on line %d NULL -- Testing json_encode() function with more than expected no. of arguments -- - -Warning: json_encode() expects at most 2 parameters, 3 given in %s on line %d -NULL +string(5) ""abc"" ===Done=== diff --git a/ext/json/tests/pass001.1.phpt b/ext/json/tests/pass001.1.phpt index 7e15a7622a..a51f885780 100644 --- a/ext/json/tests/pass001.1.phpt +++ b/ext/json/tests/pass001.1.phpt @@ -90,10 +90,10 @@ $arr = json_decode($test, true); var_dump($arr); echo "ENCODE: FROM OBJECT\n"; -$obj_enc = json_encode($obj); +$obj_enc = json_encode($obj, JSON_PARTIAL_OUTPUT_ON_ERROR); echo $obj_enc . "\n"; echo "ENCODE: FROM ARRAY\n"; -$arr_enc = json_encode($arr); +$arr_enc = json_encode($arr, JSON_PARTIAL_OUTPUT_ON_ERROR); echo $arr_enc . "\n"; echo "DECODE AGAIN: AS OBJECT\n"; diff --git a/ext/json/tests/pass001.1_64bit.phpt b/ext/json/tests/pass001.1_64bit.phpt index 9c3e669952..ff2714436d 100644 --- a/ext/json/tests/pass001.1_64bit.phpt +++ b/ext/json/tests/pass001.1_64bit.phpt @@ -90,10 +90,10 @@ $arr = json_decode($test, true); var_dump($arr); echo "ENCODE: FROM OBJECT\n"; -$obj_enc = json_encode($obj); +$obj_enc = json_encode($obj, JSON_PARTIAL_OUTPUT_ON_ERROR); echo $obj_enc . "\n"; echo "ENCODE: FROM ARRAY\n"; -$arr_enc = json_encode($arr); +$arr_enc = json_encode($arr, JSON_PARTIAL_OUTPUT_ON_ERROR); echo $arr_enc . "\n"; echo "DECODE AGAIN: AS OBJECT\n"; diff --git a/ext/json/tests/pass001.phpt b/ext/json/tests/pass001.phpt index 43be11e2b0..1fd05fcdd8 100644 --- a/ext/json/tests/pass001.phpt +++ b/ext/json/tests/pass001.phpt @@ -79,10 +79,10 @@ $arr = json_decode($test, true); var_dump($arr); echo "ENCODE: FROM OBJECT\n"; -$obj_enc = json_encode($obj); +$obj_enc = json_encode($obj, JSON_PARTIAL_OUTPUT_ON_ERROR); echo $obj_enc . "\n"; echo "ENCODE: FROM ARRAY\n"; -$arr_enc = json_encode($arr); +$arr_enc = json_encode($arr, JSON_PARTIAL_OUTPUT_ON_ERROR); echo $arr_enc . "\n"; echo "DECODE AGAIN: AS OBJECT\n"; diff --git a/ext/json/tests/unsupported_type_error.phpt b/ext/json/tests/unsupported_type_error.phpt new file mode 100644 index 0000000000..45a167a5ac --- /dev/null +++ b/ext/json/tests/unsupported_type_error.phpt @@ -0,0 +1,26 @@ +--TEST-- +An error is thrown when an unsupported type is encoded +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +$resource = fopen(__FILE__, "r"); + +var_dump($resource); + +var_dump(json_encode($resource)); +var_dump(json_last_error(), json_last_error_msg()); + +var_dump(json_encode($resource, JSON_PARTIAL_OUTPUT_ON_ERROR)); +var_dump(json_last_error(), json_last_error_msg()); + +?> +--EXPECTF-- +resource(5) of type (stream) +bool(false) +int(8) +string(21) "Type is not supported" +string(4) "null" +int(8) +string(21) "Type is not supported" |