summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2005-05-05 17:36:53 +0000
committerDmitry Stogov <dmitry@php.net>2005-05-05 17:36:53 +0000
commit89511b316a6e1c2e46c76a0bc1acb51a46247731 (patch)
tree3fe784e2382b5d7093a9d77e2542d0c2134768d6 /Zend/zend_execute.c
parentfbe44d03459d9f606bbd7973213f70cbfac6a23f (diff)
downloadphp-git-89511b316a6e1c2e46c76a0bc1acb51a46247731.tar.gz
Fixed bug #31525 (object reference being dropped. $this getting lost)
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 86413efc13..e6e14150f8 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -2281,6 +2281,15 @@ int zend_assign_ref_handler(ZEND_OPCODE_HANDLER_ARGS)
{
zval **value_ptr_ptr = get_zval_ptr_ptr(&opline->op2, EX(Ts), BP_VAR_W);
+ if (opline->op2.op_type == IS_VAR &&
+ !(*value_ptr_ptr)->is_ref &&
+ opline->extended_value == ZEND_RETURNS_FUNCTION &&
+ !EX_T(opline->op2.u.var).var.fcall_returned_reference) {
+ zend_error(E_STRICT, "Only variables should be assigned by reference");
+ PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
+ return zend_assign_handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ }
+
zend_assign_to_variable_reference(&opline->result, get_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_W), value_ptr_ptr, EX(Ts) TSRMLS_CC);
NEXT_OPCODE();