From 488779bc2c62a210d5731cfce9963c7e5654e8c3 Mon Sep 17 00:00:00 2001 From: Sean DuBois Date: Thu, 17 Sep 2015 06:49:55 +0000 Subject: [PATCH 1/6] Before when unpacking a class if the container already had properties (keys came before classname in the payload) we would stomp on the keys. This would cause memory leaks and loss of data, now when initalizing the new class preserve those properties --- msgpack_unpack.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/msgpack_unpack.c b/msgpack_unpack.c index 45701ba..5298168 100644 --- a/msgpack_unpack.c +++ b/msgpack_unpack.c @@ -198,9 +198,14 @@ inline static zend_class_entry* msgpack_unserialize_class( { zend_class_entry *ce, **pce; zend_bool incomplete_class = 0; - zval *user_func, *retval_ptr, **args[1], *arg_func_name; - TSRMLS_FETCH(); + zval *user_func, *retval_ptr, **args[1], *arg_func_name, container_tmp, *val; + HashPosition hash_pos; + char *key_str; + ulong key_long; + uint key_len; + TSRMLS_FETCH(); + ZVAL_NULL(&container_tmp); do { /* Try to find class directly */ @@ -269,8 +274,24 @@ inline static zend_class_entry* msgpack_unserialize_class( return NULL; } + if (Z_TYPE_PP(container) == IS_ARRAY) { + ZVAL_COPY_VALUE(&container_tmp, *container); + } + object_init_ex(*container, ce); + if (Z_TYPE(container_tmp) != IS_NULL) { + zend_hash_internal_pointer_reset_ex(HASH_OF(&container_tmp), &hash_pos); + while (zend_hash_get_current_data_ex(HASH_OF(&container_tmp), (void *)&val, &hash_pos) == SUCCESS) { + if (zend_hash_get_current_key_ex(HASH_OF(&container_tmp), &key_str, &key_len, &key_long, 0, &hash_pos) == HASH_KEY_IS_STRING) { + zend_symtable_update(HASH_OF(*container), key_str, key_len, val, sizeof(val), NULL); + } else { + zend_hash_index_update(HASH_OF(*container), key_len, val, sizeof(val), NULL); + } + zend_hash_move_forward_ex(HASH_OF(&container_tmp) , &hash_pos); + } + } + /* store incomplete class name */ if (incomplete_class) { From 178a7f070b1f723f7ff9ff172c41340007d3e4e2 Mon Sep 17 00:00:00 2001 From: Eugene Leonovich Date: Thu, 17 Sep 2015 22:42:00 +0200 Subject: [PATCH 2/6] Test null byte key position --- tests/139.phpt | 132 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 tests/139.phpt diff --git a/tests/139.phpt b/tests/139.phpt new file mode 100644 index 0000000..c26c9b2 --- /dev/null +++ b/tests/139.phpt @@ -0,0 +1,132 @@ +--TEST-- +Null byte key position while unpacking objects +--SKIPIF-- + 'stdClass' + $placeholder = hex2bin('a178a178'); // 'x' => 'x' + + $serialized = msgpack_pack($array); + $serialized = str_replace($placeholder, $stdClass, $serialized); + $unserialized = msgpack_unpack($serialized); + + var_dump($unserialized); + unset($array['x']); + + echo $unserialized == (object) $array ? 'OK' : 'ERROR', PHP_EOL; +} + +$array = array('x' => 'x', 'foo' => 1); +test('single property, key at the beginning', $array); + +$array = array('foo' => 1, 'x' => 'x'); +test('single property, key at the end', $array); + +$array = array('x' => 'x', 'foo' => 1, 'bar' => 2); +test('multiple properties, key at the beginning', $array); + +$array = array('foo' => 1, 'x' => 'x', 'bar' => 2); +test('multiple properties, key in the middle', $array); + +$array = array('foo' => 1, 'bar' => 2, 'x' => 'x'); +test('multiple properties, key at the end', $array); + +$array = array('null' => null, 'x' => 'x'); +test('null, key at the end', $array); + +$array = array('int' => 1, 'x' => 'x'); +test('int, key at the end', $array); + +$array = array('float' => 4.2, 'x' => 'x'); +test('float, key at the end', $array); + +$array = array('string' => 'str', 'x' => 'x'); +test('string, key at the end', $array); + +$array = array('array' => array(42), 'x' => 'x'); +test('array, key at the end', $array); + +class Foo { public $a = null; } +$obj = new Foo(); +$array = array('object' => $obj, 'x' => 'x'); +test('object, key at the end', $array); + +--EXPECTF-- +object(stdClass)#%d (1) { + ["foo"]=> + int(1) +} +OK +object(stdClass)#%d (1) { + ["foo"]=> + int(1) +} +OK +object(stdClass)#%d (2) { + ["foo"]=> + int(1) + ["bar"]=> + int(2) +} +OK +object(stdClass)#%d (2) { + ["foo"]=> + int(1) + ["bar"]=> + int(2) +} +OK +object(stdClass)#%d (2) { + ["foo"]=> + int(1) + ["bar"]=> + int(2) +} +OK +object(stdClass)#%d (1) { + ["null"]=> + NULL +} +OK +object(stdClass)#%d (1) { + ["int"]=> + int(1) +} +OK +object(stdClass)#%d (1) { + ["float"]=> + float(4.2) +} +OK +object(stdClass)#1 (1) { + ["string"]=> + string(3) "str" +} +OK +object(stdClass)#1 (1) { + ["array"]=> + array(1) { + [0]=> + int(42) + } +} +OK +object(stdClass)#3 (1) { + ["object"]=> + object(Foo)#2 (1) { + ["a"]=> + NULL + } +} +OK From bc11c9cc7f3369dc3e0f62ad6b8a687499eb9740 Mon Sep 17 00:00:00 2001 From: Eugene Leonovich Date: Thu, 17 Sep 2015 22:47:59 +0200 Subject: [PATCH 3/6] Tweak test #139 --- tests/139.phpt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/139.phpt b/tests/139.phpt index c26c9b2..5c0abb3 100644 --- a/tests/139.phpt +++ b/tests/139.phpt @@ -109,12 +109,12 @@ object(stdClass)#%d (1) { float(4.2) } OK -object(stdClass)#1 (1) { +object(stdClass)#%d (1) { ["string"]=> string(3) "str" } OK -object(stdClass)#1 (1) { +object(stdClass)#%d (1) { ["array"]=> array(1) { [0]=> @@ -122,9 +122,9 @@ object(stdClass)#1 (1) { } } OK -object(stdClass)#3 (1) { +object(stdClass)#%d (1) { ["object"]=> - object(Foo)#2 (1) { + object(Foo)#%d (1) { ["a"]=> NULL } From 78a92ff3b21d74e30103326103bd1db692f6e5d8 Mon Sep 17 00:00:00 2001 From: Eugene Leonovich Date: Fri, 9 Oct 2015 23:28:59 +0200 Subject: [PATCH 4/6] Replace hardcoded object ids with %d in tests --- tests/025.phpt | 12 ++-- tests/025c.phpt | 12 ++-- tests/028.phpt | 16 ++--- tests/028b.phpt | 160 ++++++++++++++++++++++++------------------------ tests/028c.phpt | 160 ++++++++++++++++++++++++------------------------ tests/028d.phpt | 160 ++++++++++++++++++++++++------------------------ 6 files changed, 260 insertions(+), 260 deletions(-) diff --git a/tests/025.phpt b/tests/025.phpt index cb45a39..63e5412 100644 --- a/tests/025.phpt +++ b/tests/025.phpt @@ -53,7 +53,7 @@ test('array', $array, true); --EXPECTF-- array(3) { [0]=> - object(Obj)#1 (4) { + object(Obj)#%d (4) { ["a"]=> string(2) "aa" [%r"?b"?:protected"?%r]=> @@ -64,7 +64,7 @@ array(3) { string(2) "dd" } [1]=> - object(Obj)#2 (4) { + object(Obj)#%d (4) { ["a"]=> string(2) "ee" [%r"?b"?:protected"?%r]=> @@ -75,7 +75,7 @@ array(3) { string(2) "hh" } [2]=> - object(Obj)#3 (4) { + object(Obj)#%d (4) { ["a"]=> int(1) [%r"?b"?:protected"?%r]=> @@ -88,7 +88,7 @@ array(3) { } array(3) { [0]=> - object(Obj)#4 (4) { + object(Obj)#%d (4) { ["a"]=> string(2) "aa" [%r"?b"?:protected"?%r]=> @@ -99,7 +99,7 @@ array(3) { NULL } [1]=> - object(Obj)#5 (4) { + object(Obj)#%d (4) { ["a"]=> string(2) "ee" [%r"?b"?:protected"?%r]=> @@ -110,7 +110,7 @@ array(3) { NULL } [2]=> - object(Obj)#6 (4) { + object(Obj)#%d (4) { ["a"]=> int(1) [%r"?b"?:protected"?%r]=> diff --git a/tests/025c.phpt b/tests/025c.phpt index 35018bb..0c7f273 100644 --- a/tests/025c.phpt +++ b/tests/025c.phpt @@ -53,7 +53,7 @@ test('array', $array, true); --EXPECTF-- array(3) { [0]=> - object(Obj)#1 (4) { + object(Obj)#%d (4) { ["a"]=> string(2) "aa" ["b:protected"]=> @@ -64,7 +64,7 @@ array(3) { string(2) "dd" } [1]=> - object(Obj)#2 (4) { + object(Obj)#%d (4) { ["a"]=> string(2) "ee" ["b:protected"]=> @@ -75,7 +75,7 @@ array(3) { string(2) "hh" } [2]=> - object(Obj)#3 (4) { + object(Obj)#%d (4) { ["a"]=> int(1) ["b:protected"]=> @@ -88,7 +88,7 @@ array(3) { } array(3) { [0]=> - object(Obj)#4 (4) { + object(Obj)#%d (4) { ["a"]=> string(2) "aa" ["b:protected"]=> @@ -99,7 +99,7 @@ array(3) { NULL } [1]=> - object(Obj)#5 (4) { + object(Obj)#%d (4) { ["a"]=> string(2) "ee" ["b:protected"]=> @@ -110,7 +110,7 @@ array(3) { NULL } [2]=> - object(Obj)#6 (4) { + object(Obj)#%d (4) { ["a"]=> int(1) ["b:protected"]=> diff --git a/tests/028.phpt b/tests/028.phpt index a55b90b..91fc304 100644 --- a/tests/028.phpt +++ b/tests/028.phpt @@ -108,9 +108,9 @@ read write: 84c001a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0040002a70042617200643282c0040002a5002a00643382c0040002a5002a00643282c0040003a2643382c0040003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0040009a5002a00643282c0040009a2643382c0040009a70042617200643282c004000aa5002a00643382c004000a array(3) { ["old"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -119,7 +119,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -128,7 +128,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -140,9 +140,9 @@ array(3) { ["test"]=> string(6) "foobar" ["new"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -151,7 +151,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -160,7 +160,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> diff --git a/tests/028b.phpt b/tests/028b.phpt index 651dc96..5ec9347 100644 --- a/tests/028b.phpt +++ b/tests/028b.phpt @@ -108,13 +108,13 @@ read write: 84c001a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0040002a70042617200643282c0040002a5002a00643382c0040002a5002a00643282c0040003a2643382c0040003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0040009a5002a00643282c0040009a2643382c0040009a70042617200643282c004000aa5002a00643382c004000a array(3) { ["old"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -123,7 +123,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -132,7 +132,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -142,9 +142,9 @@ array(3) { } } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -153,7 +153,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -162,7 +162,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -172,9 +172,9 @@ array(3) { } } [%r"?d3"?:protected"?%r]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -183,7 +183,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -192,7 +192,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -203,11 +203,11 @@ array(3) { } } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -216,7 +216,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -225,7 +225,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -235,9 +235,9 @@ array(3) { } } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -246,7 +246,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -255,7 +255,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -265,9 +265,9 @@ array(3) { } } [%r"?d3"?:protected"?%r]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -276,7 +276,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -285,7 +285,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -296,11 +296,11 @@ array(3) { } } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -309,7 +309,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -318,7 +318,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -328,9 +328,9 @@ array(3) { } } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -339,7 +339,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -348,7 +348,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -358,9 +358,9 @@ array(3) { } } [%r"?d3"?:protected"?%r]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -369,7 +369,7 @@ array(3) { *RECURSION* } [%r"?d2"?:protected"?%r]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -378,7 +378,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* [%r"?d2"?:("Bar":)?private"?%r]=> @@ -392,13 +392,13 @@ array(3) { ["test"]=> string(6) "foobar" ["new"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -407,7 +407,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -416,7 +416,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -426,9 +426,9 @@ array(3) { } } [%r"?d2"?:protected"?%r]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -437,7 +437,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -446,7 +446,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -456,9 +456,9 @@ array(3) { } } ["d3"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -467,7 +467,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -476,7 +476,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -487,11 +487,11 @@ array(3) { } } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -500,7 +500,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -509,7 +509,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -519,9 +519,9 @@ array(3) { } } [%r"?d2"?:protected"?%r]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -530,7 +530,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -539,7 +539,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -549,9 +549,9 @@ array(3) { } } ["d3"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -560,7 +560,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -569,7 +569,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -580,11 +580,11 @@ array(3) { } } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -593,7 +593,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -602,7 +602,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -612,9 +612,9 @@ array(3) { } } [%r"?d2"?:protected"?%r]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -623,7 +623,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -632,7 +632,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -642,9 +642,9 @@ array(3) { } } ["d3"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -653,7 +653,7 @@ array(3) { *RECURSION* } [%r"?d2"?:("Bar":)?private"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> @@ -662,7 +662,7 @@ array(3) { *RECURSION* } [%r"?d3"?:protected"?%r]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { [%r"?d1"?:("Foo":)?private"?%r]=> *RECURSION* [%r"?d2"?:protected"?%r]=> diff --git a/tests/028c.phpt b/tests/028c.phpt index a841c97..6a4e942 100644 --- a/tests/028c.phpt +++ b/tests/028c.phpt @@ -104,13 +104,13 @@ read write: 83a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0040002a70042617200643282c0040002a5002a00643382c0040002a5002a00643282c0040003a2643382c0040003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0040009a5002a00643282c0040009a2643382c0040009a70042617200643282c004000aa5002a00643382c004000a array(3) { ["old"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -119,7 +119,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -128,7 +128,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -138,9 +138,9 @@ array(3) { } } ["d2:private"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -149,7 +149,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -158,7 +158,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -168,9 +168,9 @@ array(3) { } } ["d3:protected"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -179,7 +179,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -188,7 +188,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -199,11 +199,11 @@ array(3) { } } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -212,7 +212,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -221,7 +221,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -231,9 +231,9 @@ array(3) { } } ["d2:private"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -242,7 +242,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -251,7 +251,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -261,9 +261,9 @@ array(3) { } } ["d3:protected"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -272,7 +272,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -281,7 +281,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -292,11 +292,11 @@ array(3) { } } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -305,7 +305,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -314,7 +314,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -324,9 +324,9 @@ array(3) { } } ["d2:private"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -335,7 +335,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -344,7 +344,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -354,9 +354,9 @@ array(3) { } } ["d3:protected"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -365,7 +365,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -374,7 +374,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -388,13 +388,13 @@ array(3) { ["test"]=> string(6) "foobar" ["new"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -403,7 +403,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -412,7 +412,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -422,9 +422,9 @@ array(3) { } } ["d2:protected"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -433,7 +433,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -442,7 +442,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -452,9 +452,9 @@ array(3) { } } ["d3"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -463,7 +463,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -472,7 +472,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -483,11 +483,11 @@ array(3) { } } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -496,7 +496,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -505,7 +505,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -515,9 +515,9 @@ array(3) { } } ["d2:protected"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -526,7 +526,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -535,7 +535,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -545,9 +545,9 @@ array(3) { } } ["d3"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -556,7 +556,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -565,7 +565,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -576,11 +576,11 @@ array(3) { } } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -589,7 +589,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -598,7 +598,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -608,9 +608,9 @@ array(3) { } } ["d2:protected"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -619,7 +619,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -628,7 +628,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -638,9 +638,9 @@ array(3) { } } ["d3"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -649,7 +649,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -658,7 +658,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> diff --git a/tests/028d.phpt b/tests/028d.phpt index ef4c8b4..e9ad436 100644 --- a/tests/028d.phpt +++ b/tests/028d.phpt @@ -103,13 +103,13 @@ read write: 83a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0040002a70042617200643282c0040002a5002a00643382c0040002a5002a00643282c0040003a2643382c0040003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0040009a5002a00643282c0040009a2643382c0040009a70042617200643282c004000aa5002a00643382c004000a array(3) { ["old"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -118,7 +118,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -127,7 +127,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -137,9 +137,9 @@ array(3) { } } ["d2:private"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -148,7 +148,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -157,7 +157,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -167,9 +167,9 @@ array(3) { } } ["d3:protected"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -178,7 +178,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -187,7 +187,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -198,11 +198,11 @@ array(3) { } } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -211,7 +211,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -220,7 +220,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -230,9 +230,9 @@ array(3) { } } ["d2:private"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -241,7 +241,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -250,7 +250,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -260,9 +260,9 @@ array(3) { } } ["d3:protected"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -271,7 +271,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -280,7 +280,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -291,11 +291,11 @@ array(3) { } } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -304,7 +304,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -313,7 +313,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -323,9 +323,9 @@ array(3) { } } ["d2:private"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -334,7 +334,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -343,7 +343,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -353,9 +353,9 @@ array(3) { } } ["d3:protected"]=> - object(Foo)#3 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -364,7 +364,7 @@ array(3) { *RECURSION* } ["d2:protected"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -373,7 +373,7 @@ array(3) { *RECURSION* } ["d3"]=> - object(Bar)#4 (3) { + object(Bar)#%d (3) { ["d1"]=> *RECURSION* ["d2:private"]=> @@ -387,13 +387,13 @@ array(3) { ["test"]=> string(6) "foobar" ["new"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -402,7 +402,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -411,7 +411,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -421,9 +421,9 @@ array(3) { } } ["d2:protected"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -432,7 +432,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -441,7 +441,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -451,9 +451,9 @@ array(3) { } } ["d3"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -462,7 +462,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -471,7 +471,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -482,11 +482,11 @@ array(3) { } } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -495,7 +495,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -504,7 +504,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -514,9 +514,9 @@ array(3) { } } ["d2:protected"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -525,7 +525,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -534,7 +534,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -544,9 +544,9 @@ array(3) { } } ["d3"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -555,7 +555,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -564,7 +564,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -575,11 +575,11 @@ array(3) { } } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -588,7 +588,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -597,7 +597,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -607,9 +607,9 @@ array(3) { } } ["d2:protected"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -618,7 +618,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -627,7 +627,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -637,9 +637,9 @@ array(3) { } } ["d3"]=> - object(Bar)#5 (3) { + object(Bar)#%d (3) { ["d1"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -648,7 +648,7 @@ array(3) { *RECURSION* } ["d2:private"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> @@ -657,7 +657,7 @@ array(3) { *RECURSION* } ["d3:protected"]=> - object(Foo)#6 (3) { + object(Foo)#%d (3) { ["d1:private"]=> *RECURSION* ["d2:protected"]=> From 105961a93599a5a12f2e33eaebe7b25ac69f1984 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 27 Oct 2015 10:48:59 +0800 Subject: [PATCH 5/6] only support php up to 5.6.99 --- package.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/package.xml b/package.xml index 65680e3..54ddc00 100644 --- a/package.xml +++ b/package.xml @@ -260,6 +260,7 @@ 5.0.0 + 5.6.99 1.4.3 From e04f9f396f73d724305f0a8cc05768558a2610ff Mon Sep 17 00:00:00 2001 From: Sean DuBois Date: Thu, 3 Dec 2015 01:06:27 +0000 Subject: [PATCH 6/6] Add test to ensure __set/__get are not called during packing/unpacking --- tests/bug013.phpt | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tests/bug013.phpt diff --git a/tests/bug013.phpt b/tests/bug013.phpt new file mode 100644 index 0000000..ecccfd7 --- /dev/null +++ b/tests/bug013.phpt @@ -0,0 +1,42 @@ +--TEST-- +Bug #13 (ensure that __get/__set aren't called when packing/unpacking) +--SKIPIF-- +$name = $value; + } + public function __get($name) { + echo 'Called __get' . PHP_EOL; + return $this->$name; + } +} + +$magicInstance = new \magicClass; +$magicInstance->val = 5; +var_dump($magicInstance); + +$packed = msgpack_pack($magicInstance); +var_dump(bin2hex($packed)); +$unpacked = msgpack_unpack($packed); +var_dump($unpacked); + +?> +--EXPECTF-- +Called __set +object(magicClass)#%d (1) { + ["val"]=> + int(5) +} +string(36) "82c0aa6d61676963436c617373a376616c05" +object(magicClass)#%d (1) { + ["val"]=> + int(5) +}