mirror of
https://github.com/php/php-src.git
synced 2024-12-01 05:43:38 +08:00
Fix bug #61537 (json_encode() incorrectly truncates/discards information) and
remove a test case that's now mooted by this fix.
This commit is contained in:
parent
1c8fccdf6d
commit
3f3ad30c50
4
NEWS
4
NEWS
@ -2,6 +2,10 @@ PHP NEWS
|
|||||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||
?? ??? 2012, PHP 5.3.12
|
?? ??? 2012, PHP 5.3.12
|
||||||
|
|
||||||
|
- JSON
|
||||||
|
. Fixed bug #61537 (json_encode() incorrectly truncates/discards
|
||||||
|
information). (Adam)
|
||||||
|
|
||||||
?? ??? 2012, PHP 5.3.11
|
?? ??? 2012, PHP 5.3.11
|
||||||
- Iconv extension:
|
- Iconv extension:
|
||||||
. Fixed a bug that iconv extension fails to link to the correct library
|
. Fixed a bug that iconv extension fails to link to the correct library
|
||||||
|
@ -73,6 +73,7 @@ static PHP_MINIT_FUNCTION(json)
|
|||||||
REGISTER_LONG_CONSTANT("JSON_HEX_QUOT", PHP_JSON_HEX_QUOT, CONST_CS | CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("JSON_HEX_QUOT", PHP_JSON_HEX_QUOT, CONST_CS | CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("JSON_FORCE_OBJECT", PHP_JSON_FORCE_OBJECT, CONST_CS | CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("JSON_FORCE_OBJECT", PHP_JSON_FORCE_OBJECT, CONST_CS | CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("JSON_NUMERIC_CHECK", PHP_JSON_NUMERIC_CHECK, CONST_CS | CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("JSON_NUMERIC_CHECK", PHP_JSON_NUMERIC_CHECK, 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_NONE", PHP_JSON_ERROR_NONE, CONST_CS | CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("JSON_ERROR_DEPTH", PHP_JSON_ERROR_DEPTH, CONST_CS | CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("JSON_ERROR_DEPTH", PHP_JSON_ERROR_DEPTH, CONST_CS | CONST_PERSISTENT);
|
||||||
@ -320,9 +321,7 @@ static void json_escape_string(smart_str *buf, char *s, int len, int options TSR
|
|||||||
}
|
}
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
JSON_G(error_code) = PHP_JSON_ERROR_UTF8;
|
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");
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid UTF-8 sequence in argument");
|
|
||||||
}
|
|
||||||
smart_str_appendl(buf, "null", 4);
|
smart_str_appendl(buf, "null", 4);
|
||||||
} else {
|
} else {
|
||||||
smart_str_appendl(buf, "\"\"", 2);
|
smart_str_appendl(buf, "\"\"", 2);
|
||||||
@ -571,7 +570,11 @@ static PHP_FUNCTION(json_encode)
|
|||||||
|
|
||||||
php_json_encode(&buf, parameter, options TSRMLS_CC);
|
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);
|
smart_str_free(&buf);
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,7 @@ PHP_JSON_API void php_json_decode(zval *return_value, char *str, int str_len, ze
|
|||||||
#define PHP_JSON_HEX_QUOT (1<<3)
|
#define PHP_JSON_HEX_QUOT (1<<3)
|
||||||
#define PHP_JSON_FORCE_OBJECT (1<<4)
|
#define PHP_JSON_FORCE_OBJECT (1<<4)
|
||||||
#define PHP_JSON_NUMERIC_CHECK (1<<5)
|
#define PHP_JSON_NUMERIC_CHECK (1<<5)
|
||||||
|
#define PHP_JSON_PARTIAL_OUTPUT_ON_ERROR (1<<9)
|
||||||
|
|
||||||
#define PHP_JSON_OUTPUT_ARRAY 0
|
#define PHP_JSON_OUTPUT_ARRAY 0
|
||||||
#define PHP_JSON_OUTPUT_OBJECT 1
|
#define PHP_JSON_OUTPUT_OBJECT 1
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
--TEST--
|
|
||||||
Bug #43941 (json_encode() invalid UTF-8)
|
|
||||||
--SKIPIF--
|
|
||||||
<?php if (!extension_loaded("json")) print "skip"; ?>
|
|
||||||
--FILE--
|
|
||||||
<?php
|
|
||||||
|
|
||||||
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")));
|
|
||||||
|
|
||||||
echo "Done\n";
|
|
||||||
?>
|
|
||||||
--EXPECTF--
|
|
||||||
string(5) ""abc""
|
|
||||||
string(4) "null"
|
|
||||||
string(4) "null"
|
|
||||||
string(17) "[null,null,"abc"]"
|
|
||||||
Done
|
|
||||||
|
|
@ -29,7 +29,14 @@ json_encode($c);
|
|||||||
var_dump(json_last_error());
|
var_dump(json_last_error());
|
||||||
?>
|
?>
|
||||||
--EXPECTF--
|
--EXPECTF--
|
||||||
|
Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d
|
||||||
int(5)
|
int(5)
|
||||||
|
|
||||||
|
Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d
|
||||||
int(5)
|
int(5)
|
||||||
|
|
||||||
|
Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d
|
||||||
int(5)
|
int(5)
|
||||||
|
|
||||||
|
Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d
|
||||||
int(5)
|
int(5)
|
||||||
|
30
ext/json/tests/bug61537.phpt
Normal file
30
ext/json/tests/bug61537.phpt
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
--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), json_last_error());
|
||||||
|
var_dump(json_encode($invalid_utf8, JSON_PARTIAL_OUTPUT_ON_ERROR), json_last_error());
|
||||||
|
|
||||||
|
$invalid_utf8 = "an invalid sequen\xce in the middle of a string";
|
||||||
|
var_dump(json_encode($invalid_utf8), json_last_error());
|
||||||
|
var_dump(json_encode($invalid_utf8, JSON_PARTIAL_OUTPUT_ON_ERROR), json_last_error());
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d
|
||||||
|
bool(false)
|
||||||
|
int(5)
|
||||||
|
|
||||||
|
Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d
|
||||||
|
string(4) "null"
|
||||||
|
int(5)
|
||||||
|
|
||||||
|
Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d
|
||||||
|
bool(false)
|
||||||
|
int(5)
|
||||||
|
|
||||||
|
Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d
|
||||||
|
string(4) "null"
|
||||||
|
int(5)
|
Loading…
Reference in New Issue
Block a user