diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c index c0fcbe328202a..d56cc24695130 100644 --- a/ext/json/json_encoder.c +++ b/ext/json/json_encoder.c @@ -104,7 +104,8 @@ static inline void php_json_encode_double(smart_str *buf, double d, int options) php_gcvt(d, (int)PG(serialize_precision), '.', 'e', num); len = strlen(num); - if (options & PHP_JSON_PRESERVE_ZERO_FRACTION && strchr(num, '.') == NULL && len < PHP_DOUBLE_MAX_LENGTH - 2) { + if ((options & PHP_JSON_PRESERVE_ZERO_FRACTION && strchr(num, '.') == NULL && len < PHP_DOUBLE_MAX_LENGTH - 2) + || (UNEXPECTED(len == 2 && num[0] == '-' && num[1] == '0'))) { num[len++] = '.'; num[len++] = '0'; num[len] = '\0'; diff --git a/ext/json/tests/bug79908.phpt b/ext/json/tests/bug79908.phpt new file mode 100644 index 0000000000000..b2aea31069a12 --- /dev/null +++ b/ext/json/tests/bug79908.phpt @@ -0,0 +1,12 @@ +--TEST-- +Bug #79908 (json_encode encodes negative zero as int) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(4) "-0.0"