diff options
author | Nikita Popov <nikic@php.net> | 2016-12-18 17:10:19 +0100 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2016-12-18 17:10:19 +0100 |
commit | c1af9f282f62eaf8a5973068ce373a800e0f752c (patch) | |
tree | fd87d46a0e54d4ddcdebf767c5e237562617083d | |
parent | eb636fcb56911e5b79de83fa8886b12f702d9920 (diff) | |
download | php-git-c1af9f282f62eaf8a5973068ce373a800e0f752c.tar.gz |
Fix bug #46103
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/reflection/php_reflection.c | 10 | ||||
-rw-r--r-- | ext/reflection/tests/bug46103.phpt | 18 |
3 files changed, 32 insertions, 0 deletions
@@ -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" + } +} |