mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fixed bug #71297 (Memory leak with yield from)
This commit is contained in:
parent
42e0fff928
commit
033d608771
3 changed files with 28 additions and 1 deletions
1
NEWS
1
NEWS
|
@ -11,6 +11,7 @@ PHP NEWS
|
|||
(Bob)
|
||||
. Fixed bug #71273 (A wrong ext directory setup in php.ini leads to crash).
|
||||
(Anatol)
|
||||
. Fixed bug #71297 (Memory leak with consecutive yield from). (Bob)
|
||||
|
||||
- CURL:
|
||||
. Fixed bug #71225 (curl_setopt() fails to set CURLOPT_POSTFIELDS with
|
||||
|
|
25
Zend/tests/generators/bug71297.phpt
Normal file
25
Zend/tests/generators/bug71297.phpt
Normal file
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
Bug #71297 (Memory leak with consecutive yield from)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function foo() {
|
||||
yield array_fill(0, 10000, 4);
|
||||
}
|
||||
|
||||
function genLeak() {
|
||||
$i = 0;
|
||||
while (1) {
|
||||
yield from foo();
|
||||
print $i++;
|
||||
}
|
||||
}
|
||||
|
||||
$x = 0;
|
||||
foreach (genLeak() as $i) {
|
||||
if ($x++ == 3) break;
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
012
|
|
@ -495,7 +495,7 @@ ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator
|
|||
if (EXPECTED(EG(exception) == NULL)) {
|
||||
zend_op *yield_from = (zend_op *) root->execute_data->opline - 1;
|
||||
|
||||
if (yield_from->opcode == ZEND_YIELD_FROM && !(yield_from->result_type & EXT_TYPE_UNUSED)) {
|
||||
if (yield_from->opcode == ZEND_YIELD_FROM) {
|
||||
if (Z_ISUNDEF(root->node.parent->retval)) {
|
||||
/* Throw the exception in the context of the generator */
|
||||
zend_execute_data *original_execute_data = EG(current_execute_data);
|
||||
|
@ -512,6 +512,7 @@ ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator
|
|||
|
||||
EG(current_execute_data) = original_execute_data;
|
||||
} else {
|
||||
zval_dtor(&root->value);
|
||||
ZVAL_COPY(&root->value, &root->node.parent->value);
|
||||
ZVAL_COPY(ZEND_CALL_VAR(root->execute_data, yield_from->result.var), &root->node.parent->retval);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue