From: Bob Weinand Date: Thu, 7 Jan 2016 10:56:10 +0000 (+0100) Subject: Fixed bug #71297 (Memory leak with yield from) X-Git-Tag: php-7.0.3RC1~64 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=033d6087711332efab4fbb1cb90acabd9af8534b;p=php Fixed bug #71297 (Memory leak with yield from) --- diff --git a/NEWS b/NEWS index 758b70e21f..d33a8fdc4f 100644 --- a/NEWS +++ b/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 diff --git a/Zend/tests/generators/bug71297.phpt b/Zend/tests/generators/bug71297.phpt new file mode 100644 index 0000000000..eed7278601 --- /dev/null +++ b/Zend/tests/generators/bug71297.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #71297 (Memory leak with consecutive yield from) +--FILE-- + +--EXPECT-- +012 diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index b5e6c6a221..09cbb9a5ee 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -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); }