From: Nikita Popov Date: Tue, 30 Jun 2020 09:16:13 +0000 (+0200) Subject: Fix leak in isDefaultValueAvailable() X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c2b23d8cbec7bbcbd2cfc5166ae7f619f915bb9d;p=php Fix leak in isDefaultValueAvailable() Exposed in Symfony due to exit changes. --- 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-- +isDefaultValueAvailable()); +var_dump($rp->isDefaultValueConstant()); +var_dump($rp->getDefaultValue()); + +?> +--EXPECT-- +bool(true) +bool(false) +array(1) { + [0]=> + int(123) +}