diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-08-26 11:32:01 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-08-26 11:32:01 +0200 |
commit | d179e34e42e8e9cc5250ba2265fb50a8187bb6b1 (patch) | |
tree | 5a10d2dd72046a2b45a89e81296dcb19f260afd2 | |
parent | 3324bb893e965010cdac9b029a74f26072b5f540 (diff) | |
download | php-git-d179e34e42e8e9cc5250ba2265fb50a8187bb6b1.tar.gz |
Fix memory leak when yielding from non-iterable
-rw-r--r-- | Zend/tests/generators/yield_from_non_iterable.phpt | 18 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 1 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 4 |
3 files changed, 23 insertions, 0 deletions
diff --git a/Zend/tests/generators/yield_from_non_iterable.phpt b/Zend/tests/generators/yield_from_non_iterable.phpt new file mode 100644 index 0000000000..705bcaec35 --- /dev/null +++ b/Zend/tests/generators/yield_from_non_iterable.phpt @@ -0,0 +1,18 @@ +--TEST-- +Yield from non-iterable +--FILE-- +<?php + +function gen() { + yield from new stdClass; +} + +try { + gen()->current(); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +Can use "yield from" only with arrays and Traversables diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 9c46476b6a..70e33039da 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -7371,6 +7371,7 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY) } } else { zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables"); + FREE_OP1(); UNDEF_RESULT(); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a84cfe3d4b..9d7515e9d0 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3707,6 +3707,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER( } } else { zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -18346,6 +18347,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE } } else { zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables"); + zval_ptr_dtor_nogc(free_op1); UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -21672,6 +21674,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE } } else { zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables"); + zval_ptr_dtor_nogc(free_op1); UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -37896,6 +37899,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN } } else { zend_throw_error(NULL, "Can use \"yield from\" only with arrays and Traversables"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } |