]> granicus.if.org Git - php/commitdiff
Fix leaks in yield from error conditions
authorNikita Popov <nikic@php.net>
Thu, 14 Jul 2016 13:55:30 +0000 (15:55 +0200)
committerNikita Popov <nikic@php.net>
Thu, 14 Jul 2016 16:38:45 +0000 (18:38 +0200)
Conflicts:
Zend/zend_vm_execute.h

Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 299067fddec81d53e90eecdeffd30e33d2d80f80..c1e985ea1df4504867ffc7f3173df8cf7b056fc2 100644 (file)
@@ -7469,12 +7469,14 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
                        if (Z_ISUNDEF(new_gen->retval)) {
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
+                                       zval_ptr_dtor(val);
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
                                }
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
+                               zval_ptr_dtor(val);
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {
index 9722cf6fbc5f823b9fb7fbb601beab578955944e..3203af2c8582c63648256557d95ce0068a4e8469 100644 (file)
@@ -4135,12 +4135,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
                        if (Z_ISUNDEF(new_gen->retval)) {
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
+                                       zval_ptr_dtor(val);
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
                                }
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
+                               zval_ptr_dtor(val);
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {
@@ -12537,12 +12539,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
                        if (Z_ISUNDEF(new_gen->retval)) {
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
+                                       zval_ptr_dtor(val);
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
                                }
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
+                               zval_ptr_dtor(val);
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {
@@ -16358,12 +16362,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
                        if (Z_ISUNDEF(new_gen->retval)) {
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
+                                       zval_ptr_dtor(val);
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
                                }
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
+                               zval_ptr_dtor(val);
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {
@@ -29802,12 +29808,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN
                        if (Z_ISUNDEF(new_gen->retval)) {
                                if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
                                        zend_throw_error(NULL, "Impossible to yield from the Generator being currently run");
+                                       zval_ptr_dtor(val);
                                        HANDLE_EXCEPTION();
                                } else {
                                        zend_generator_yield_from(generator, new_gen);
                                }
                        } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
                                zend_throw_error(NULL, "Generator passed to yield from was aborted without proper return and is unable to continue");
+                               zval_ptr_dtor(val);
                                HANDLE_EXCEPTION();
                        } else {
                                if (RETURN_VALUE_USED(opline)) {