Browse Source

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.
pull/242/head
Nikita Popov 14 years ago
parent
commit
60871e51ad
  1. 17
      Zend/tests/generators/finally_ran_on_close.phpt
  2. 1
      Zend/zend_generators.c

17
Zend/tests/generators/finally_ran_on_close.phpt

@ -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

1
Zend/zend_generators.c

@ -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;

Loading…
Cancel
Save