From: Adam Harvey Date: Mon, 2 Apr 2012 01:46:18 +0000 (+0800) Subject: Fix bug #61537 (json_encode() incorrectly truncates/discards information) and X-Git-Tag: php-5.4.4RC1~129 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cb2a1c71c96d7c9b2ee03d77beae0c8e0d385f1b;p=php Fix bug #61537 (json_encode() incorrectly truncates/discards information) and remove a test case that's now mooted by this fix. --- diff --git a/NEWS b/NEWS index 42f7cd98ed..05cc254c65 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,14 @@ PHP NEWS $_SERVER['SCRIPT_FILENAME'] when using router). (Laruence) . "Connection: close" instead of "Connection: closed" (Gustavo) +- JSON + . Fixed bug #61537 (json_encode() incorrectly truncates/discards + information). (Adam) + +?? ??? 2012, PHP 5.3.11 + +(merge after 5.3.11 release) + - Core: . Fixed bug #61660 (bin2hex(hex2bin($data)) != $data). (Nikita Popov) . Fixed bug #61650 (ini parser crashes when using ${xxxx} ini variables diff --git a/ext/json/json.c b/ext/json/json.c index fc1fcb7f1f..853611e7aa 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -96,6 +96,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); @@ -389,9 +390,7 @@ 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"); - } + 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); @@ -689,7 +688,11 @@ static PHP_FUNCTION(json_encode) 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); } diff --git a/ext/json/php_json.h b/ext/json/php_json.h index ef3e4b5a79..20426c0153 100644 --- a/ext/json/php_json.h +++ b/ext/json/php_json.h @@ -63,6 +63,7 @@ extern 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/bug43941.phpt b/ext/json/tests/bug43941.phpt deleted file mode 100644 index 0f86d1dfad..0000000000 --- a/ext/json/tests/bug43941.phpt +++ /dev/null @@ -1,21 +0,0 @@ ---TEST-- -Bug #43941 (json_encode() invalid UTF-8) ---SKIPIF-- - ---FILE-- - ---EXPECTF-- -string(5) ""abc"" -string(4) "null" -string(4) "null" -string(17) "[null,null,"abc"]" -Done - diff --git a/ext/json/tests/bug54058.phpt b/ext/json/tests/bug54058.phpt index 3b1136bdd9..08c7f579ab 100644 --- a/ext/json/tests/bug54058.phpt +++ b/ext/json/tests/bug54058.phpt @@ -29,7 +29,14 @@ json_encode($c); var_dump(json_last_error()); ?> --EXPECTF-- +Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d int(5) + +Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d int(5) + +Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d int(5) + +Warning: json_encode(): Invalid UTF-8 sequence in argument in %s on line %d int(5) diff --git a/ext/json/tests/bug61537.phpt b/ext/json/tests/bug61537.phpt new file mode 100644 index 0000000000..e2abdda66a --- /dev/null +++ b/ext/json/tests/bug61537.phpt @@ -0,0 +1,30 @@ +--TEST-- +Bug #61537 (json_encode() incorrectly truncates/discards information) +--SKIPIF-- + +--FILE-- + +--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)