summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2016-12-18 17:10:19 +0100
committerNikita Popov <nikic@php.net>2016-12-18 17:10:19 +0100
commitc1af9f282f62eaf8a5973068ce373a800e0f752c (patch)
treefd87d46a0e54d4ddcdebf767c5e237562617083d
parenteb636fcb56911e5b79de83fa8886b12f702d9920 (diff)
downloadphp-git-c1af9f282f62eaf8a5973068ce373a800e0f752c.tar.gz
Fix bug #46103
-rw-r--r--NEWS4
-rw-r--r--ext/reflection/php_reflection.c10
-rw-r--r--ext/reflection/tests/bug46103.phpt18
3 files changed, 32 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 2285d5dddb..60995adcae 100644
--- a/NEWS
+++ b/NEWS
@@ -32,6 +32,10 @@ PHP NEWS
(Bob)
. Fixed issue getting executable lines from custom wrappers. (Bob)
+- Reflection:
+ . Fixed bug #46103 (ReflectionObject memory leak). (Nikita)
+
+
08 Dec 2016 PHP 7.0.14
- Core:
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index b24f9c691d..1c13aa5090 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -344,6 +344,15 @@ static void reflection_free_objects_storage(zend_object *object) /* {{{ */
}
/* }}} */
+static HashTable *reflection_get_gc(zval *obj, zval **gc_data, int *gc_data_count) /* {{{ */
+{
+ reflection_object *intern = Z_REFLECTION_P(obj);
+ *gc_data = &intern->obj;
+ *gc_data_count = 1;
+ return zend_std_get_properties(obj);
+}
+/* }}} */
+
static zend_object *reflection_objects_new(zend_class_entry *class_type) /* {{{ */
{
reflection_object *intern;
@@ -6524,6 +6533,7 @@ PHP_MINIT_FUNCTION(reflection) /* {{{ */
reflection_object_handlers.free_obj = reflection_free_objects_storage;
reflection_object_handlers.clone_obj = NULL;
reflection_object_handlers.write_property = _reflection_write_property;
+ reflection_object_handlers.get_gc = reflection_get_gc;
INIT_CLASS_ENTRY(_reflection_entry, "ReflectionException", reflection_exception_functions);
reflection_exception_ptr = zend_register_internal_class_ex(&_reflection_entry, zend_ce_exception);
diff --git a/ext/reflection/tests/bug46103.phpt b/ext/reflection/tests/bug46103.phpt
new file mode 100644
index 0000000000..978a9c2c46
--- /dev/null
+++ b/ext/reflection/tests/bug46103.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #46103: ReflectionObject memory leak
+--FILE--
+<?php
+
+$obj = new stdClass;
+$obj->r = new ReflectionObject($obj);
+var_dump($obj);
+
+?>
+--EXPECT--
+object(stdClass)#1 (1) {
+ ["r"]=>
+ object(ReflectionObject)#2 (1) {
+ ["name"]=>
+ string(8) "stdClass"
+ }
+}