summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Weinand <bobwei9@hotmail.com>2017-07-01 11:52:03 +0200
committerBob Weinand <bobwei9@hotmail.com>2017-07-01 11:52:03 +0200
commite3cc15daf2abc1b4886d4888c3bf5ca9cef035c8 (patch)
tree75d83e60c407d5ecaacdf9277aece164698bc022
parent2a1ad885388d1287b7a963d5b9ca9d297163ec19 (diff)
downloadphp-git-e3cc15daf2abc1b4886d4888c3bf5ca9cef035c8.tar.gz
Fixed bug #74840 (Opcache overwrites argument of GENERATOR_RETURN within finally)
-rw-r--r--NEWS4
-rw-r--r--Zend/tests/bug74840.phpt21
-rw-r--r--ext/opcache/Optimizer/optimize_temp_vars_5.c1
3 files changed, 26 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 28a7d290b2..3a97a4596b 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,10 @@ PHP NEWS
. Fixed bug #74761 (Unary operator expected error on some systems). (petk)
. Fixed bug #73900 (Use After Free in unserialize() SplFixedArray). (nikic)
+- Opcache:
+ . Fixed bug #74840 (Opcache overwrites argument of GENERATOR_RETURN within
+ finally). (Bob)
+
- PDO:
. Fixed bug #69356 (PDOStatement::debugDumpParams() truncates query). (Adam
Baratz)
diff --git a/Zend/tests/bug74840.phpt b/Zend/tests/bug74840.phpt
new file mode 100644
index 0000000000..68e27cba84
--- /dev/null
+++ b/Zend/tests/bug74840.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #74840: Opcache overwrites argument of GENERATOR_RETURN within finally
+--FILE--
+<?php
+
+$g = (function($a) {
+ try {
+ return $a + 1;
+ } finally {
+ $b = $a + 2;
+ var_dump($b);
+ }
+ yield; // Generator
+})(1);
+$g->next();
+var_dump($g->getReturn());
+
+?>
+--EXPECT--
+int(3)
+int(2)
diff --git a/ext/opcache/Optimizer/optimize_temp_vars_5.c b/ext/opcache/Optimizer/optimize_temp_vars_5.c
index cfeb1214c8..5cc7b79e89 100644
--- a/ext/opcache/Optimizer/optimize_temp_vars_5.c
+++ b/ext/opcache/Optimizer/optimize_temp_vars_5.c
@@ -109,6 +109,7 @@ void optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_ctx *c
*/
if ((op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) &&
(opline->opcode == ZEND_RETURN ||
+ opline->opcode == ZEND_GENERATOR_RETURN ||
opline->opcode == ZEND_RETURN_BY_REF ||
opline->opcode == ZEND_FREE ||
opline->opcode == ZEND_FE_FREE)) {