]> granicus.if.org Git - php/commitdiff
Fix leak in isDefaultValueAvailable()
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 30 Jun 2020 09:16:13 +0000 (11:16 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 30 Jun 2020 09:16:56 +0000 (11:16 +0200)
Exposed in Symfony due to exit changes.

ext/reflection/php_reflection.c
ext/reflection/tests/default_value_leak.phpt [new file with mode: 0644]

index 29da1f4ddd74585cd4e6614a855a2b52035664c2..33aeddde8967991aaca704c533d9518a516d9ebf 100644 (file)
@@ -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 (file)
index 0000000..85b6382
--- /dev/null
@@ -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)
+}