summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-03-08 00:02:12 +0400
committerDmitry Stogov <dmitry@zend.com>2014-03-08 00:02:12 +0400
commit7cd78822abc746e94842bf8b2b566a434fe4c448 (patch)
treea092b8b4286b61966d9b1f5b5214199efa8c56e7
parent3f794ba743c0b96c4834d914ef45ab909c26bb13 (diff)
downloadphp-git-7cd78822abc746e94842bf8b2b566a434fe4c448.tar.gz
Fixed assignment to reference
-rw-r--r--Zend/zend_execute.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 118763852f..7977c873b3 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -954,6 +954,7 @@ static inline zval* zend_assign_const_to_variable(zval *variable_ptr, zval *valu
static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
{
zval garbage;
+ int is_ref = 0;
if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
if (EXPECTED(!Z_ISREF_P(value))) {
@@ -964,11 +965,16 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
return variable_ptr;
} else if (Z_ISREF_P(variable_ptr)) {
variable_ptr = Z_REFVAL_P(variable_ptr);
+ is_ref = 1;
}
if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
if (EXPECTED(!Z_ISREF_P(value))) {
- ZVAL_COPY(variable_ptr, value);
+ if (!is_ref) {
+ ZVAL_COPY(variable_ptr, value);
+ } else {
+ ZVAL_DUP(variable_ptr, value);
+ }
} else {
ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
}