summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2005-07-18 07:41:11 +0000
committerDmitry Stogov <dmitry@php.net>2005-07-18 07:41:11 +0000
commit2fb797e32522bdd8777b12aeeff1d84d9edd2aed (patch)
tree09187b8d2a882d06dc2ef3eed72996dec1143b75
parent522bdfb820314caf95f6117675035e231c57566a (diff)
downloadphp-git-2fb797e32522bdd8777b12aeeff1d84d9edd2aed.tar.gz
Fixed bug #33558 (warning with nested calls to functions returning by reference)
-rw-r--r--NEWS2
-rwxr-xr-xZend/tests/bug33558.phpt21
-rw-r--r--Zend/zend_execute.c5
3 files changed, 26 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 328451ee12..9ec4c52829 100644
--- a/NEWS
+++ b/NEWS
@@ -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;