From 7c556c44a10bfc53c37295626e61bd99dc4f550c Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sun, 15 Oct 2017 19:36:15 +0100 Subject: [PATCH] Fix bug #68567 (JSON_PARTIAL_OUTPUT_ON_ERROR can result in JSON with null key) --- NEWS | 4 ++++ ext/json/json_encoder.c | 9 +++++++-- ext/json/tests/bug68567.phpt | 14 ++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 ext/json/tests/bug68567.phpt diff --git a/NEWS b/NEWS index bc73ef59e40..8c032088c10 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,10 @@ PHP NEWS - Fileinfo: . Upgrade bundled libmagic to 5.31. (Anatol) +- JSON: + . Fixed bug #68567 (JSON_PARTIAL_OUTPUT_ON_ERROR can result in JSON with null + key). (Jakub Zelenka) + - Opcache: . Fixed bug #75370 (Webserver hangs on valid PHP text). (Laruence) . Fixed bug #75357 (segfault loading WordPress wp-admin). (Laruence) diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c index 1fa23442041..fcdb315954d 100644 --- a/ext/json/json_encoder.c +++ b/ext/json/json_encoder.c @@ -189,8 +189,13 @@ static int php_json_encode_array(smart_str *buf, zval *val, int options, php_jso php_json_pretty_print_char(buf, options, '\n'); php_json_pretty_print_indent(buf, options, encoder); - php_json_escape_string(buf, ZSTR_VAL(key), ZSTR_LEN(key), - options & ~PHP_JSON_NUMERIC_CHECK, encoder); + if (php_json_escape_string(buf, ZSTR_VAL(key), ZSTR_LEN(key), + options & ~PHP_JSON_NUMERIC_CHECK, encoder) == FAILURE && + (options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR) && + buf->s) { + ZSTR_LEN(buf->s) -= 4; + smart_str_appendl(buf, "\"\"", 2); + } } else { if (need_comma) { smart_str_appendc(buf, ','); diff --git a/ext/json/tests/bug68567.phpt b/ext/json/tests/bug68567.phpt new file mode 100644 index 00000000000..6d4082c2b73 --- /dev/null +++ b/ext/json/tests/bug68567.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #68567 JSON_PARTIAL_OUTPUT_ON_ERROR can result in JSON with null key +--SKIPIF-- + +--FILE-- + 1), JSON_PARTIAL_OUTPUT_ON_ERROR)); + +?> +===DONE=== +--EXPECTF-- +string(6) "{"":1}" +===DONE===