Browse Source

Revert "Fixed bug #72170 (JsonSerializable may inc apply count without dec it)"

This reverts commit 459a7cc209.
PHP-7.0.7
Xinchen Hui 10 years ago
parent
commit
197470b62f
  1. 2
      NEWS
  2. 83
      ext/json/json_encoder.c
  3. 32
      ext/json/tests/bug72170.phpt

2
NEWS

@ -24,8 +24,6 @@ PHP NEWS
. Fixed bug #72157 (use-after-free caused by dba_open). (Shm, Laruence) . Fixed bug #72157 (use-after-free caused by dba_open). (Shm, Laruence)
- JSON: - JSON:
. Fixed bug #72170 (JsonSerializable may inc apply count without dec it).
(Laruence)
. Fixed bug #72069 (Behavior \JsonSerializable different from json_encode). . Fixed bug #72069 (Behavior \JsonSerializable different from json_encode).
(Laruence) (Laruence)

83
ext/json/json_encoder.c

@ -157,8 +157,26 @@ static void php_json_encode_array(smart_str *buf, zval *val, int options) /* {{{
ZEND_HASH_INC_APPLY_COUNT(tmp_ht); ZEND_HASH_INC_APPLY_COUNT(tmp_ht);
} }
zend_try {
if (r == PHP_JSON_OUTPUT_ARRAY) {
if (r == PHP_JSON_OUTPUT_ARRAY) {
if (need_comma) {
smart_str_appendc(buf, ',');
} else {
need_comma = 1;
}
php_json_pretty_print_char(buf, options, '\n');
php_json_pretty_print_indent(buf, options);
php_json_encode(buf, data, options);
} else if (r == PHP_JSON_OUTPUT_OBJECT) {
if (key) {
if (ZSTR_VAL(key)[0] == '\0' && Z_TYPE_P(val) == IS_OBJECT) {
/* Skip protected and private members. */
if (tmp_ht && ZEND_HASH_APPLY_PROTECTION(tmp_ht)) {
ZEND_HASH_DEC_APPLY_COUNT(tmp_ht);
}
continue;
}
if (need_comma) { if (need_comma) {
smart_str_appendc(buf, ','); smart_str_appendc(buf, ',');
} else { } else {
@ -167,58 +185,33 @@ static void php_json_encode_array(smart_str *buf, zval *val, int options) /* {{{
php_json_pretty_print_char(buf, options, '\n'); php_json_pretty_print_char(buf, options, '\n');
php_json_pretty_print_indent(buf, options); php_json_pretty_print_indent(buf, options);
php_json_encode(buf, data, options);
} else if (r == PHP_JSON_OUTPUT_OBJECT) {
if (key) {
if (ZSTR_VAL(key)[0] == '\0' && Z_TYPE_P(val) == IS_OBJECT) {
/* Skip protected and private members. */
if (tmp_ht && ZEND_HASH_APPLY_PROTECTION(tmp_ht)) {
ZEND_HASH_DEC_APPLY_COUNT(tmp_ht);
}
continue;
}
if (need_comma) {
smart_str_appendc(buf, ',');
} else {
need_comma = 1;
}
php_json_pretty_print_char(buf, options, '\n');
php_json_pretty_print_indent(buf, options);
php_json_escape_string(buf, ZSTR_VAL(key), ZSTR_LEN(key), options & ~PHP_JSON_NUMERIC_CHECK);
smart_str_appendc(buf, ':');
php_json_escape_string(buf, ZSTR_VAL(key), ZSTR_LEN(key), options & ~PHP_JSON_NUMERIC_CHECK);
smart_str_appendc(buf, ':');
php_json_pretty_print_char(buf, options, ' ');
php_json_pretty_print_char(buf, options, ' ');
php_json_encode(buf, data, options);
php_json_encode(buf, data, options);
} else {
if (need_comma) {
smart_str_appendc(buf, ',');
} else { } else {
if (need_comma) {
smart_str_appendc(buf, ',');
} else {
need_comma = 1;
}
need_comma = 1;
}
php_json_pretty_print_char(buf, options, '\n');
php_json_pretty_print_indent(buf, options);
php_json_pretty_print_char(buf, options, '\n');
php_json_pretty_print_indent(buf, options);
smart_str_appendc(buf, '"');
smart_str_append_long(buf, (zend_long) index);
smart_str_appendc(buf, '"');
smart_str_appendc(buf, ':');
smart_str_appendc(buf, '"');
smart_str_append_long(buf, (zend_long) index);
smart_str_appendc(buf, '"');
smart_str_appendc(buf, ':');
php_json_pretty_print_char(buf, options, ' ');
php_json_pretty_print_char(buf, options, ' ');
php_json_encode(buf, data, options);
}
}
} zend_catch {
if (tmp_ht && ZEND_HASH_APPLY_PROTECTION(tmp_ht)) {
ZEND_HASH_DEC_APPLY_COUNT(tmp_ht);
php_json_encode(buf, data, options);
} }
zend_bailout();
} zend_end_try();
}
if (tmp_ht && ZEND_HASH_APPLY_PROTECTION(tmp_ht)) { if (tmp_ht && ZEND_HASH_APPLY_PROTECTION(tmp_ht)) {
ZEND_HASH_DEC_APPLY_COUNT(tmp_ht); ZEND_HASH_DEC_APPLY_COUNT(tmp_ht);

32
ext/json/tests/bug72170.phpt

@ -1,32 +0,0 @@
--TEST--
Bug #72170 (JsonSerializable may inc apply count without dec it)
--SKIPIF--
<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
class Dummy implements JsonSerializable{
public function jsonSerialize() {
global $flag;
if ($flag) {
exit;
} else {
return "okey";
}
}
}
$array = array();
$array[] = new Dummy;
register_shutdown_function(function() use($array) {
global $flag;
$flag = 0;
var_dump(json_encode(array($array)));
});
$flag = 1;
json_encode(array($array));
?>
--EXPECT--
string(10) "[["okey"]]"
Loading…
Cancel
Save