Fix bug #63596: finally in generators segfaults

EX(fast_ret) wasn't initialized in this case so the code ended up
dereferencing an invalid pointer after the jump.
This commit is contained in:
Nikita Popov 2012-11-24 18:21:11 +01:00
parent 966faa9a87
commit 60871e51ad
2 changed files with 12 additions and 6 deletions

View File

@ -5,14 +5,18 @@ finally is run even if a generator is closed mid-execution
function gen() {
try {
echo "before yield\n";
yield;
echo "after yield\n";
try {
echo "before yield\n";
yield;
echo "after yield\n";
} finally {
echo "finally run\n";
}
echo "code after finally\n";
} finally {
echo "finally run\n";
echo "second finally run\n";
}
echo "code after finally\n";
echo "code after second finally\n";
}
$gen = gen();
@ -23,3 +27,4 @@ unset($gen);
--EXPECT--
before yield
finally run
second finally run

View File

@ -60,6 +60,7 @@ void zend_generator_close(zend_generator *generator, zend_bool finished_executio
* the resume. */
if (finally_op_num) {
execute_data->opline = &op_array->opcodes[finally_op_num];
execute_data->fast_ret = NULL;
generator->flags |= ZEND_GENERATOR_FORCED_CLOSE;
zend_generator_resume(generator TSRMLS_CC);
return;