diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-06-30 11:16:13 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-06-30 11:16:56 +0200 |
commit | c2b23d8cbec7bbcbd2cfc5166ae7f619f915bb9d (patch) | |
tree | 7972c77cfe94b390f0fb251edbe9d9ad563b4c20 /ext | |
parent | 8c11d8fedb8738e6e11eb8b87e3ef88b85ed049a (diff) | |
download | php-git-c2b23d8cbec7bbcbd2cfc5166ae7f619f915bb9d.tar.gz |
Fix leak in isDefaultValueAvailable()
Exposed in Symfony due to exit changes.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/reflection/php_reflection.c | 5 | ||||
-rw-r--r-- | ext/reflection/tests/default_value_leak.phpt | 22 |
2 files changed, 25 insertions, 2 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 29da1f4ddd..33aeddde89 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2813,10 +2813,11 @@ ZEND_METHOD(ReflectionParameter, isDefaultValueConstant) if (Z_TYPE(default_value) == IS_CONSTANT_AST) { zend_ast *ast = Z_ASTVAL(default_value); RETVAL_BOOL(ast->kind == ZEND_AST_CONSTANT || ast->kind == ZEND_AST_CONSTANT_CLASS); - zval_ptr_dtor_nogc(&default_value); } else { - RETURN_FALSE; + RETVAL_FALSE; } + + zval_ptr_dtor_nogc(&default_value); } /* }}} */ diff --git a/ext/reflection/tests/default_value_leak.phpt b/ext/reflection/tests/default_value_leak.phpt new file mode 100644 index 0000000000..85b6382935 --- /dev/null +++ b/ext/reflection/tests/default_value_leak.phpt @@ -0,0 +1,22 @@ +--TEST-- +Check that isDefaultValueConstant() does not leak +--FILE-- +<?php + +class Test { + public function method($param = [123]) {} +} + +$rp = new ReflectionParameter(['Test', 'method'], 'param'); +var_dump($rp->isDefaultValueAvailable()); +var_dump($rp->isDefaultValueConstant()); +var_dump($rp->getDefaultValue()); + +?> +--EXPECT-- +bool(true) +bool(false) +array(1) { + [0]=> + int(123) +} |