summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2018-01-09 20:24:25 +0100
committerNikita Popov <nikita.ppv@gmail.com>2018-01-09 20:24:48 +0100
commit2dd80a078251273cdfd8d8fda71651e5ecc40040 (patch)
tree4dc3bf70bfd92b202950e231a9dfeac963afe004
parentc8eda195aa3e28e3e54be0bf749cb12e5b51132d (diff)
parentfd30c59e041eb4ccaabb2099bb3be15a55e2988d (diff)
downloadphp-git-2dd80a078251273cdfd8d8fda71651e5ecc40040.tar.gz
Merge branch 'PHP-7.1' into PHP-7.2
-rw-r--r--NEWS2
-rw-r--r--Zend/tests/bug75786.phpt18
-rw-r--r--Zend/zend_vm_def.h7
-rw-r--r--Zend/zend_vm_execute.h7
4 files changed, 24 insertions, 10 deletions
diff --git a/NEWS b/NEWS
index 5120e832a1..ad409a113f 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@ PHP NEWS
(Laruence)
. Fixed bug #75679 (Path 260 character problem). (Anatol)
. Fixed bug #75614 (Some non-portable == in shell scripts). (jdolecek)
+ . Fixed bug #75786 (segfault when using spread operator on generator passed
+ by reference). (Nikita)
- Opcache:
. Fixed bug #75687 (var 8 (TMP) has array key type but not value type).
diff --git a/Zend/tests/bug75786.phpt b/Zend/tests/bug75786.phpt
new file mode 100644
index 0000000000..b93111b9e3
--- /dev/null
+++ b/Zend/tests/bug75786.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #75786: segfault when using spread operator on generator passed by reference
+--FILE--
+<?php
+
+function &gen($items) {
+ foreach ($items as $key => &$value) {
+ yield $key => $value;
+ }
+}
+
+var_dump(...gen(['a', 'b', 'c']));
+
+?>
+--EXPECT--
+string(1) "a"
+string(1) "b"
+string(1) "c"
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 3502cb02b6..7eb91efe8b 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -4468,11 +4468,8 @@ ZEND_VM_C_LABEL(send_again):
);
}
- if (Z_ISREF_P(arg)) {
- ZVAL_DUP(arg, Z_REFVAL_P(arg));
- } else {
- if (Z_REFCOUNTED_P(arg)) Z_ADDREF_P(arg);
- }
+ ZVAL_DEREF(arg);
+ Z_TRY_ADDREF_P(arg);
zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1);
top = ZEND_CALL_ARG(EX(call), arg_num);
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 997fc78bdf..d8eb5a5743 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -1291,11 +1291,8 @@ send_again:
);
}
- if (Z_ISREF_P(arg)) {
- ZVAL_DUP(arg, Z_REFVAL_P(arg));
- } else {
- if (Z_REFCOUNTED_P(arg)) Z_ADDREF_P(arg);
- }
+ ZVAL_DEREF(arg);
+ Z_TRY_ADDREF_P(arg);
zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1);
top = ZEND_CALL_ARG(EX(call), arg_num);