]> granicus.if.org Git - php/commitdiff
Fixed bug #68370 ("unset($this)" can make the program crash)
authorXinchen Hui <laruence@php.net>
Mon, 10 Nov 2014 05:46:47 +0000 (13:46 +0800)
committerXinchen Hui <laruence@php.net>
Mon, 10 Nov 2014 05:46:47 +0000 (13:46 +0800)
NEWS
Zend/tests/bug68370.phpt [new file with mode: 0644]
Zend/zend_execute_API.c

diff --git a/NEWS b/NEWS
index 9e5e1388c81aa41668d8cb71bdc4993ccbdda8d0..79a2b8893f5524fe33cce5f72b8787c792868a31 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ PHP                                                                        NEWS
 ?? ??? 2014, PHP 5.5.19
 
 - Core:
+  . Fixed bug #68370 ("unset($this)" can make the program crash). (Laruence)
   . Fixed bug #68095 (AddressSanitizer reports a heap buffer overflow in 
     php_getopt()). (Stas)
   . Fixed bug #68118 ($a->foo .= 'test'; can leave $a->foo undefined). (Nikita)
diff --git a/Zend/tests/bug68370.phpt b/Zend/tests/bug68370.phpt
new file mode 100644 (file)
index 0000000..25589bf
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Bug #68370 "unset($this)" can make the program crash
+--FILE--
+<?php
+class C {
+       public function test() {
+               unset($this);
+               return get_defined_vars();
+       }
+}
+$c = new C();
+$x = $c->test();
+print_r($x);
+unset($c, $x);
+--EXPECTF--
+Array
+(
+)
index 7e2a3378dace8e3f0cc03405298b2af483b2ccf0..9d4eebf01008ee9059d8777cb4aef53e989f0f6c 100644 (file)
@@ -1761,13 +1761,6 @@ ZEND_API void zend_rebuild_symbol_table(TSRMLS_D) /* {{{ */
                                /*printf("Cache miss!  Initialized %x\n", EG(active_symbol_table));*/
                        }
                        ex->symbol_table = EG(active_symbol_table);
-
-                       if (ex->op_array->this_var != -1 &&
-                           !*EX_CV_NUM(ex, ex->op_array->this_var) &&
-                           EG(This)) {
-                           *EX_CV_NUM(ex, ex->op_array->this_var) = (zval**)EX_CV_NUM(ex, ex->op_array->last_var + ex->op_array->this_var);
-                               **EX_CV_NUM(ex, ex->op_array->this_var) = EG(This);
-                       }
                        for (i = 0; i < ex->op_array->last_var; i++) {
                                if (*EX_CV_NUM(ex, i)) {
                                        zend_hash_quick_update(EG(active_symbol_table),