summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--Zend/zend_builtin_functions.c2
-rw-r--r--ext/json/tests/bug71835.phpt17
3 files changed, 22 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 0cccc6abe7..63b405f42a 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,10 @@ PHP NEWS
. Fixed bug #69659 (ArrayAccess, isset() and the offsetExists method).
(Nikita)
+- JSON:
+ . Fixed bug #71835 (json_encode sometimes incorrectly detects recursion
+ with JsonSerializable). (Jakub Zelenka)
+
- ODBC:
. Fixed bug #63171 (Script hangs after max_execution_time). (Remi)
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 231424f1de..a576455fa3 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -1183,7 +1183,7 @@ ZEND_FUNCTION(get_object_vars)
zobj = Z_OBJ_P(obj);
- if (!zobj->ce->default_properties_count && properties == zobj->properties) {
+ if (!zobj->ce->default_properties_count && properties == zobj->properties && !ZEND_HASH_GET_APPLY_COUNT(properties)) {
/* fast copy */
if (EXPECTED(zobj->handlers == &std_object_handlers)) {
if (EXPECTED(!(GC_FLAGS(properties) & IS_ARRAY_IMMUTABLE))) {
diff --git a/ext/json/tests/bug71835.phpt b/ext/json/tests/bug71835.phpt
new file mode 100644
index 0000000000..bbca19829b
--- /dev/null
+++ b/ext/json/tests/bug71835.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Bug #71835 (json_encode sometimes incorrectly detects recursion with JsonSerializable)
+--SKIPIF--
+<?php if (!extension_loaded("json")) print "skip"; ?>
+--FILE--
+<?php
+class SomeClass implements JsonSerializable {
+ public function jsonSerialize() {
+ return [get_object_vars($this)];
+ }
+}
+$class = new SomeClass;
+$arr = [$class];
+var_dump(json_encode($arr));
+?>
+--EXPECT--
+string(6) "[[[]]]"