]> granicus.if.org Git - php/commitdiff
Fixed bug #71617
authorNikita Popov <nikic@php.net>
Sun, 21 Feb 2016 11:59:57 +0000 (12:59 +0100)
committerNikita Popov <nikic@php.net>
Sun, 21 Feb 2016 12:00:37 +0000 (13:00 +0100)
NEWS
Zend/zend_API.c
ext/spl/tests/bug71617.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 8ae5659192b5070829f74a16b8a550c54de23c4b..0cd6c4bc7f1b475cb1bddd87b34613645e0d4cd7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,10 @@ PHP                                                                        NEWS
 - phpdbg:
   . Fixed crash when advancing (except step) inside an internal function. (Bob)
 
+- SPL:
+  . Fixed bug #71617 (private properties lost when unserializing ArrayObject).
+    (Nikita)
+
 ?? Mar 2016 PHP 7.0.4
 
 - Core:
index 2238bcb5e06767bb57c09302b871bcc9f02b8e20..a7d19f989275aa1564ebca65afc8a1ae4b548294 100644 (file)
@@ -1226,8 +1226,15 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties)
                                size_t prop_name_len;
                                if (zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_name_len) == SUCCESS) {
                                        zend_string *pname = zend_string_init(prop_name, prop_name_len, 0);
+                                       zend_class_entry *prev_scope = EG(scope);
+                                       if (class_name && class_name[0] != '*') {
+                                               zend_string *cname = zend_string_init(class_name, strlen(class_name), 0);
+                                               EG(scope) = zend_lookup_class(cname);
+                                               zend_string_release(cname);
+                                       }
                                        property_info = zend_get_property_info(object->ce, pname, 1);
                                        zend_string_release(pname);
+                                       EG(scope) = prev_scope;
                                } else {
                                        property_info = ZEND_WRONG_PROPERTY_INFO;
                                }
diff --git a/ext/spl/tests/bug71617.phpt b/ext/spl/tests/bug71617.phpt
new file mode 100644 (file)
index 0000000..412f83f
--- /dev/null
@@ -0,0 +1,50 @@
+--TEST--
+Bug #71617: private properties lost when unserializing ArrayObject
+--FILE--
+<?php
+
+class Test extends ArrayObject
+{
+
+       private $name = null;
+
+       public function __construct(array $input)
+       {
+               parent::__construct($input, ArrayObject::ARRAY_AS_PROPS);
+       }
+
+       public function setName($name)
+       {
+               $this->name = $name;
+               return $this;
+       }
+
+       public function getName()
+       {
+               return $this->name;
+       }
+}
+
+$test = new Test(['a' => 'a', 'b' => 'b']);
+$test->setName('ok');
+
+$ser = serialize($test);
+$unSer = unserialize($ser);
+
+var_dump($unSer->getName());
+var_dump($unSer);
+
+?>
+--EXPECT--
+string(2) "ok"
+object(Test)#2 (2) {
+  ["name":"Test":private]=>
+  string(2) "ok"
+  ["storage":"ArrayObject":private]=>
+  array(2) {
+    ["a"]=>
+    string(1) "a"
+    ["b"]=>
+    string(1) "b"
+  }
+}