summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-08-26 11:32:31 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-08-26 11:32:31 +0200
commitbf3e772361fe8bcc0915c123e707679e0aa619b9 (patch)
tree0c38a2ea94cb95ebee3b3232014179a245f13507
parent571f6a598f315d163fa172aaf3c7bfb53a5eceb8 (diff)
parentd179e34e42e8e9cc5250ba2265fb50a8187bb6b1 (diff)
downloadphp-git-bf3e772361fe8bcc0915c123e707679e0aa619b9.tar.gz
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fix memory leak when yielding from non-iterable
-rw-r--r--Zend/tests/generators/yield_from_non_iterable.phpt18
-rw-r--r--Zend/zend_vm_def.h1
-rw-r--r--Zend/zend_vm_execute.h4
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 233138cded..b8243f5c57 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -7906,6 +7906,7 @@ ZEND_VM_HANDLER(166, 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 941c1c48f6..24fb845114 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -4483,6 +4483,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();
}
@@ -18539,6 +18540,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();
}
@@ -21954,6 +21956,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();
}
@@ -38123,6 +38126,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();
}