Browse Source

Fix bug #61537 (json_encode() incorrectly truncates/discards information) and

remove a test case that's now mooted by this fix.
pull/51/head
Adam Harvey 14 years ago
parent
commit
cb2a1c71c9
  1. 8
      NEWS
  2. 11
      ext/json/json.c
  3. 1
      ext/json/php_json.h
  4. 21
      ext/json/tests/bug43941.phpt
  5. 7
      ext/json/tests/bug54058.phpt
  6. 30
      ext/json/tests/bug61537.phpt

8
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

11
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);
}

1
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

21
ext/json/tests/bug43941.phpt

@ -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

7
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)

30
ext/json/tests/bug61537.phpt

@ -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…
Cancel
Save