summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-06-30 11:16:13 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-06-30 11:16:56 +0200
commitc2b23d8cbec7bbcbd2cfc5166ae7f619f915bb9d (patch)
tree7972c77cfe94b390f0fb251edbe9d9ad563b4c20 /ext
parent8c11d8fedb8738e6e11eb8b87e3ef88b85ed049a (diff)
downloadphp-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.c5
-rw-r--r--ext/reflection/tests/default_value_leak.phpt22
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)
+}