]> granicus.if.org Git - php/commitdiff
Fixed altering $this via argument named "this"
authorDmitry Stogov <dmitry@php.net>
Wed, 2 May 2007 13:21:55 +0000 (13:21 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 2 May 2007 13:21:55 +0000 (13:21 +0000)
NEWS
Zend/tests/bug41117_1.phpt [new file with mode: 0755]
Zend/zend_compile.c

diff --git a/NEWS b/NEWS
index 111d33286044645fa627eb278d70cee40ab5c9ea..a25191a740fd685103fa1724ec050cef6e16e53c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,7 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Apr 2007, PHP 5.2.3RC3
+- Fixed altering $this via argument named "this". (Dmitry)
 - Fixed iterator_apply() with a callback using __call(). (Johannes)
 - Fixed bug #41215 (setAttribute return code reversed). (Ilia)
 - Fixed bug #41192 (Per Directory Values only work for one key). (Dmitry)
diff --git a/Zend/tests/bug41117_1.phpt b/Zend/tests/bug41117_1.phpt
new file mode 100755 (executable)
index 0000000..f555b63
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Bug #41117 (Altering $this via argument)
+--FILE--
+<?php
+class foo {
+  function __construct($this) {
+    echo $this."\n";
+  }
+}
+$obj = new foo("Hello world");
+?>
+--EXPECTF--
+Fatal error: Cannot re-assign $this in %sbug41117_1.php on line 3
+
index 3d4afa8f8124b4e63947e862cf06ba0b1883832d..c660d83cf4d16f8812772bcf259f4fe3bae39816 100644 (file)
@@ -1265,9 +1265,18 @@ void zend_do_end_function_declaration(znode *function_token TSRMLS_DC)
 
 void zend_do_receive_arg(zend_uchar op, znode *var, znode *offset, znode *initialization, znode *class_type, znode *varname, zend_uchar pass_by_reference TSRMLS_DC)
 {
-       zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+       zend_op *opline;
        zend_arg_info *cur_arg_info;
 
+       if (CG(active_op_array)->scope &&
+               ((CG(active_op_array)->fn_flags & ZEND_ACC_STATIC) == 0) &&
+               (Z_TYPE(varname->u.constant) == IS_STRING) &&
+               (Z_STRLEN(varname->u.constant) == sizeof("this")-1) &&
+               (memcmp(Z_STRVAL(varname->u.constant), "this", sizeof("this")) == 0)) {
+               zend_error(E_COMPILE_ERROR, "Cannot re-assign $this");
+       }
+
+       opline = get_next_op(CG(active_op_array) TSRMLS_CC);
        CG(active_op_array)->num_args++;
        opline->opcode = op;
        opline->result = *var;