From 12f4e9e020c3968c5a201ef96c4ee589ad36e5e5 Mon Sep 17 00:00:00 2001
From: Nikita Popov <nikita.ppv@gmail.com>
Date: Thu, 10 Oct 2019 12:44:55 +0200
Subject: [PATCH] Fix leak when property AST evaluation fails

---
 .../type_declarations/typed_properties_021.phpt     | 13 +++++++------
 Zend/zend_API.c                                     |  1 +
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/Zend/tests/type_declarations/typed_properties_021.phpt b/Zend/tests/type_declarations/typed_properties_021.phpt
index a9f82528d9..93a07771fb 100644
--- a/Zend/tests/type_declarations/typed_properties_021.phpt
+++ b/Zend/tests/type_declarations/typed_properties_021.phpt
@@ -6,10 +6,11 @@ class Foo {
 	public int $bar = BAR::BAZ;
 }
 
-$foo = new Foo();
+try {
+    $foo = new Foo();
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
 ?>
---EXPECTF--
-Fatal error: Uncaught Error: Class 'BAR' not found in %s:%d
-Stack trace:
-#0 {main}
-  thrown in %s on line %d
+--EXPECT--
+Class 'BAR' not found
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 3fef3733f7..8fab994297 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -1228,6 +1228,7 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */
 
 							ZVAL_COPY(&tmp, val);
 							if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) {
+								zval_ptr_dtor(&tmp);
 								return FAILURE;
 							}
 							/* property initializers must always be evaluated with strict types */;
-- 
2.40.0