]> granicus.if.org Git - php/commitdiff
Fixed bug #47165 (Possible memory corruption when passing return value by reference)
authorDmitry Stogov <dmitry@php.net>
Tue, 20 Jan 2009 11:22:45 +0000 (11:22 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 20 Jan 2009 11:22:45 +0000 (11:22 +0000)
NEWS
Zend/tests/bug47165.phpt [new file with mode: 0644]
Zend/zend_compile.c
ext/standard/tests/array/extract_variation9.phpt

diff --git a/NEWS b/NEWS
index b8438b4051c71ef9eebc94500ccf6516a63b4626..6d7b3366990466f97602bcb6da94660a2e9935c2 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -48,6 +48,8 @@ PHP                                                                        NEWS
 
 - Fixed building of pdo_sqlite without sqlite3. (Scott)
 
+- Fixed bug #47165 (Possible memory corruption when passing return value by
+  reference). (Dmitry)
 - Fixed bug #47145 + #47159 (Always free failed SQLite statements). (Scott)
 - Fixed bug #47141 (Unable to fetch error messages from SQLite
   when the database can't be opened). (Scott)
diff --git a/Zend/tests/bug47165.phpt b/Zend/tests/bug47165.phpt
new file mode 100644 (file)
index 0000000..343c98c
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Bug #47165 (Possible memory corruption when passing return value by reference)
+--FILE--
+<?php
+class Foo {
+       var $bar = array();
+
+       static function bar() {
+               static $instance = null;
+               $instance = new Foo();
+               return $instance->bar;
+       }
+}
+extract(Foo::bar());
+echo "ok\n";
+?>
+--EXPECTF--
+
+Strict Standards: Only variables should be passed by reference in %sbug47165.php on line 11
+ok
index ed2920677500132e897ec4f99fd36619e7cc6bd4..4c86b98e3993b24280e95f6b6a428e8ad7776552 100644 (file)
@@ -2128,8 +2128,17 @@ void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC)
 
        if (function_ptr) {
                if (ARG_MAY_BE_SENT_BY_REF(function_ptr, (zend_uint) offset)) {
-                       op = (param->op_type & (IS_VAR|IS_CV))?ZEND_SEND_REF:ZEND_SEND_VAL;
-                       send_by_reference = 0;
+                       if (param->op_type & (IS_VAR|IS_CV)) {
+                               send_by_reference = 1;
+                               if (op == ZEND_SEND_VAR && zend_is_function_or_method_call(param)) {
+                                       /* Method call */
+                                       op = ZEND_SEND_VAR_NO_REF;
+                                       send_function = ZEND_ARG_SEND_FUNCTION;
+                               }
+                       } else {
+                               op = ZEND_SEND_VAL;
+                               send_by_reference = 0;
+                       }
                } else {
                        send_by_reference = ARG_SHOULD_BE_SENT_BY_REF(function_ptr, (zend_uint) offset) ? ZEND_ARG_SEND_BY_REF : 0;
                }
index 9d1db4cc7b357b96c5762036b21d8945d24a9148..e0b3a75fb8a312c0b83adbeab7194055d977bce4 100644 (file)
@@ -16,5 +16,7 @@ echo "Done\n";
 ?>
 --EXPECTF--
 *** Testing for object ***
+
+Strict Standards: Only variables should be passed by reference in %sextract_variation9.php on line 10
 int(1)
 Done