remove a test case that's now mooted by this fix.
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2012, PHP 5.3.12
+- JSON
+ . Fixed bug #61537 (json_encode() incorrectly truncates/discards
+ information). (Adam)
+
?? ??? 2012, PHP 5.3.11
- Iconv extension:
. Fixed a bug that iconv extension fails to link to the correct library
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_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_DEPTH", PHP_JSON_ERROR_DEPTH, CONST_CS | CONST_PERSISTENT);
}
if (len < 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);
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);
}
#define PHP_JSON_HEX_QUOT (1<<3)
#define PHP_JSON_FORCE_OBJECT (1<<4)
#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_OBJECT 1
+++ /dev/null
---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
-
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)
--- /dev/null
+--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)