]> granicus.if.org Git - php/commitdiff
Fix bug #71835 (json_encode sometimes incorrectly detects recursion with JsonSerializ...
authorJakub Zelenka <bukka@php.net>
Sun, 20 Mar 2016 15:53:57 +0000 (15:53 +0000)
committerJakub Zelenka <bukka@php.net>
Sun, 20 Mar 2016 15:56:27 +0000 (15:56 +0000)
NEWS
Zend/zend_builtin_functions.c
ext/json/tests/bug71835.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 0cccc6abe7b3141c2a26fc891383f7b751894232..63b405f42a13c61447ea728021a53bfcc9b5210d 100644 (file)
--- 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)
 
index 231424f1de0e45a41aa13715c8ca11ec346d089d..a576455fa3bc798619840e439e67d82a770f55ae 100644 (file)
@@ -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 (file)
index 0000000..bbca198
--- /dev/null
@@ -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) "[[[]]]"