]> granicus.if.org Git - php/commitdiff
Fixed bug #72174
authorNikita Popov <nikic@php.net>
Tue, 10 May 2016 10:13:10 +0000 (12:13 +0200)
committerNikita Popov <nikic@php.net>
Tue, 10 May 2016 10:13:10 +0000 (12:13 +0200)
Also fixes a memory leak if ::getValue() is used with __get().

NEWS
ext/reflection/php_reflection.c
ext/reflection/tests/ReflectionProperty_getValue_error.phpt
ext/reflection/tests/bug72174.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 069bf1ecf8bd33ec697fe05c4d210b1e0fb3ec3d..982c9edb9a97dc5a373c99075288f1887b6100f6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -56,6 +56,10 @@ PHP                                                                        NEWS
     timestamp). (denver at timothy dot io)
   . Fixed bug #72151 (mysqli_fetch_object changed behaviour). (Anatol)
 
+- Reflection:
+  . Fixed bug #72174 (ReflectionProperty#getValue() causes __isset call).
+    (Nikita)
+
 - Session:
   . Fixed bug #71972 (Cyclic references causing session_start(): Failed to
     decode session object). (Laruence)
index 50d0ba002342d41efa753927261e5e09f295ecf9..4c3f6240f4111de768fd771f35e2291d27631432 100644 (file)
@@ -5383,8 +5383,12 @@ ZEND_METHOD(reflection_property, getValue)
                }
 
                zend_unmangle_property_name_ex(ref->prop.name, &class_name, &prop_name, &prop_name_len);
-               member_p = zend_read_property(ref->ce, object, prop_name, prop_name_len, 1, &rv);
-               ZVAL_DUP(return_value, member_p);
+               member_p = zend_read_property(ref->ce, object, prop_name, prop_name_len, 0, &rv);
+               if (member_p != &rv) {
+                       ZVAL_COPY(return_value, member_p);
+               } else {
+                       ZVAL_COPY_VALUE(return_value, member_p);
+               }
        }
 }
 /* }}} */
index c2152e9f8708e9a64a4294017b25fbfbf0b7233d..62009d8bb9ed18f9db28ceb42809dfc4a074c0d8 100644 (file)
@@ -78,4 +78,6 @@ Protected property:
 Cannot access non-public member TestClass::prot
 
 Instance without property:
+
+Notice: Undefined property: AnotherClass::$pub2 in %s on line %d
 NULL
diff --git a/ext/reflection/tests/bug72174.phpt b/ext/reflection/tests/bug72174.phpt
new file mode 100644 (file)
index 0000000..94416d6
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Bug #72174: ReflectionProperty#getValue() causes __isset call
+--FILE--
+<?php
+
+class Foo
+{
+    private $bar;
+
+    public function __construct()
+    {
+        unset($this->bar);
+    }
+
+    public function __isset($name)
+    {
+        var_dump(__METHOD__);
+        return true;
+    }
+    
+    public function __get($name)
+    {
+        var_dump(__METHOD__);
+        return $name;
+    }
+}
+
+$instance = new Foo();
+$reflectionBar = (new ReflectionProperty(Foo::class, 'bar'));
+$reflectionBar->setAccessible(true);
+var_dump($reflectionBar->getValue($instance));
+
+?>
+--EXPECT--
+string(10) "Foo::__get"
+string(3) "bar"