diff options
| author | Dmitry Stogov <dmitry@php.net> | 2005-07-18 07:41:11 +0000 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@php.net> | 2005-07-18 07:41:11 +0000 |
| commit | 2fb797e32522bdd8777b12aeeff1d84d9edd2aed (patch) | |
| tree | 09187b8d2a882d06dc2ef3eed72996dec1143b75 | |
| parent | 522bdfb820314caf95f6117675035e231c57566a (diff) | |
| download | php-git-2fb797e32522bdd8777b12aeeff1d84d9edd2aed.tar.gz | |
Fixed bug #33558 (warning with nested calls to functions returning by reference)
| -rw-r--r-- | NEWS | 2 | ||||
| -rwxr-xr-x | Zend/tests/bug33558.phpt | 21 | ||||
| -rw-r--r-- | Zend/zend_execute.c | 5 |
3 files changed, 26 insertions, 2 deletions
@@ -17,6 +17,8 @@ PHP NEWS - Fixed memory corruption in stristr(). (Derick) - Fixed segfaults when CURL callback functions throw exception. (Tony) - Fixed bug #33588 (LDAP: RootDSE query not possible). (Jani) +- Fixed bug #33558 (warning with nested calls to functions returning by + reference). (Dmitry) - Fixed bug #33520 (crash if safe_mode is on and session.save_path is changed). (Dmitry) - Fixed bug #33491 (crash after extending MySQLi internal class). (Tony) diff --git a/Zend/tests/bug33558.phpt b/Zend/tests/bug33558.phpt new file mode 100755 index 0000000000..9c87fc6017 --- /dev/null +++ b/Zend/tests/bug33558.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #33558 (warning with nested calls to functions returning by reference) +--INI-- +error_reporting=4095 +--FILE-- +<?php +function & foo() { + $var = 'ok'; + return $var; +} + +function & bar() { + return foo(); +} + +$a =& bar(); +echo "$a\n"; +?> +--EXPECT-- +ok + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b00a3a68d3..b000eb0a87 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2911,8 +2911,9 @@ int zend_return_handler(ZEND_OPCODE_HANDLER_ARGS) } if (!(*retval_ptr_ptr)->is_ref) { - if (EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr - || (opline->extended_value == ZEND_RETURNS_FUNCTION && !EX_T(opline->op1.u.var).var.fcall_returned_reference)) { + if (opline->extended_value == ZEND_RETURNS_FUNCTION && + EX_T(opline->op1.u.var).var.fcall_returned_reference) { + } else if (EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) { PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */ zend_error(E_STRICT, "Only variable references should be returned by reference"); goto return_by_value; |
