diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-11-04 11:04:11 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-11-04 11:04:11 +0100 |
commit | 7f9e7399d3b369500bc02b49b03e11960980e2ac (patch) | |
tree | b8002345a9741b9c4be93974bf69a27cedbc4bcd /ext/reflection/php_reflection.c | |
parent | 7d96dcac2c6ce177a88ac9f15849cb499bf446bb (diff) | |
parent | c9abfaec6bf61bcef6d9651827b49cc7789018fd (diff) | |
download | php-git-7f9e7399d3b369500bc02b49b03e11960980e2ac.tar.gz |
Merge branch 'PHP-7.4'
* PHP-7.4:
Fixed bug #78774
Diffstat (limited to 'ext/reflection/php_reflection.c')
-rw-r--r-- | ext/reflection/php_reflection.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index c318dae5ae..7505cd99e4 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -223,8 +223,14 @@ static void reflection_free_objects_storage(zend_object *object) /* {{{ */ efree(intern->ptr); break; case REF_TYPE_TYPE: - efree(intern->ptr); + { + type_reference *type_ref = intern->ptr; + if (ZEND_TYPE_IS_NAME(type_ref->type)) { + zend_string_release(ZEND_TYPE_NAME(type_ref->type)); + } + efree(type_ref); break; + } case REF_TYPE_FUNCTION: _free_function(intern->ptr); break; @@ -1137,6 +1143,12 @@ static void reflection_type_factory(zend_type type, zval *object) reference->type = type; intern->ptr = reference; intern->ref_type = REF_TYPE_TYPE; + + /* Property types may be resolved during the lifetime of the ReflectionType, + * so we need to make sure that the strings we reference are not released. */ + if (ZEND_TYPE_IS_NAME(type)) { + zend_string_addref(ZEND_TYPE_NAME(type)); + } } /* }}} */ |