From: Xinchen Hui Date: Fri, 6 May 2016 12:25:24 +0000 (+0800) Subject: Revert "Fixed bug #72170 (JsonSerializable may inc apply count without dec it)" X-Git-Tag: php-7.0.7RC1~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=197470b62f8256898adfe758302cb0241195c480;p=php Revert "Fixed bug #72170 (JsonSerializable may inc apply count without dec it)" This reverts commit 459a7cc209da130256d66c1f896199540f4dadbc. --- diff --git a/NEWS b/NEWS index 3878228836..fb88681b07 100644 --- a/NEWS +++ b/NEWS @@ -24,8 +24,6 @@ PHP NEWS . Fixed bug #72157 (use-after-free caused by dba_open). (Shm, Laruence) - JSON: - . Fixed bug #72170 (JsonSerializable may inc apply count without dec it). - (Laruence) . Fixed bug #72069 (Behavior \JsonSerializable different from json_encode). (Laruence) diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c index 58ea67a04a..ae9e086fc0 100644 --- a/ext/json/json_encoder.c +++ b/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_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) { smart_str_appendc(buf, ','); } 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_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 { - 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)) { ZEND_HASH_DEC_APPLY_COUNT(tmp_ht); diff --git a/ext/json/tests/bug72170.phpt b/ext/json/tests/bug72170.phpt deleted file mode 100644 index a7c25c2061..0000000000 --- a/ext/json/tests/bug72170.phpt +++ /dev/null @@ -1,32 +0,0 @@ ---TEST-- -Bug #72170 (JsonSerializable may inc apply count without dec it) ---SKIPIF-- - ---FILE-- - ---EXPECT-- -string(10) "[["okey"]]"