summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2018-01-12 21:28:10 +0100
committerNikita Popov <nikita.ppv@gmail.com>2018-01-12 21:28:24 +0100
commite112b8474a31ccb0516dfd1d9045c1cf485ecdfe (patch)
treeabb503ef408206afff04e8963752bf1f5e148363
parent8c73fc8027a7293e81c0b2e8dc2674fe34f1eb59 (diff)
parent420d11e8caf8dc76e08984dfed3a4322295a1208 (diff)
downloadphp-git-e112b8474a31ccb0516dfd1d9045c1cf485ecdfe.tar.gz
Merge branch 'PHP-7.1' into PHP-7.2
-rw-r--r--NEWS2
-rw-r--r--Zend/tests/generators/bug75396.phpt22
-rw-r--r--Zend/zend_generators.c3
3 files changed, 26 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index b3095be866..892d62ddad 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,8 @@ PHP NEWS
. Fixed bug #75786 (segfault when using spread operator on generator passed
by reference). (Nikita)
. Fixed bug #75799 (arg of get_defined_functions is optional). (carusogabriel)
+ . Fixed bug #75396 (Exit inside generator finally results in fatal error).
+ (Nikita)
- Opcache:
. Fixed bug #75687 (var 8 (TMP) has array key type but not value type).
diff --git a/Zend/tests/generators/bug75396.phpt b/Zend/tests/generators/bug75396.phpt
new file mode 100644
index 0000000000..6d5abf518f
--- /dev/null
+++ b/Zend/tests/generators/bug75396.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #75396: Exit inside generator finally results in fatal error
+--FILE--
+<?php
+
+$gen = (function () {
+ yield 42;
+
+ try {
+ echo "Try\n";
+ exit("Exit\n");
+ } finally {
+ echo "Finally\n";
+ }
+})();
+
+$gen->send("x");
+
+?>
+--EXPECT--
+Try
+Exit
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 2b2814426d..2b776249ff 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -185,7 +185,8 @@ static void zend_generator_dtor_storage(zend_object *object) /* {{{ */
generator->node.parent = NULL;
}
- if (EXPECTED(!ex) || EXPECTED(!(ex->func->op_array.fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK))) {
+ if (EXPECTED(!ex) || EXPECTED(!(ex->func->op_array.fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK))
+ || CG(unclean_shutdown)) {
return;
}