laruence                                 Wed, 28 Dec 2011 06:46:12 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=321458

Log:
Fix #60613 (Segmentation fault with $cls->{expr}() syntax)
#now the behavior is like 5.3, a COMPILER_ERROR will be triggered

Bug: https://bugs.php.net/60613 (Assigned) Segmentation fault with 
$cls->{expr}() syntax
      
Changed paths:
    U   php/php-src/branches/PHP_5_4/Zend/tests/bug60611.phpt
    U   php/php-src/branches/PHP_5_4/Zend/zend_compile.c
    U   php/php-src/trunk/Zend/tests/bug60611.phpt
    U   php/php-src/trunk/Zend/zend_compile.c

Modified: php/php-src/branches/PHP_5_4/Zend/tests/bug60611.phpt
===================================================================
--- php/php-src/branches/PHP_5_4/Zend/tests/bug60611.phpt       2011-12-28 
04:31:21 UTC (rev 321457)
+++ php/php-src/branches/PHP_5_4/Zend/tests/bug60611.phpt       2011-12-28 
06:46:12 UTC (rev 321458)
@@ -9,12 +9,6 @@
        }
 }

-Cls::{0}();
-Cls::{1.0}();
-Cls::{true}();
-Cls::{false}();
-Cls::{null}();
-
 $cls = new Cls;
 $cls->{0}();
 $cls->{1.0}();
@@ -22,7 +16,12 @@
 $cls->{false}();
 $cls->{null}();

-echo "done";
+Cls::{0}();
+Cls::{1.0}();
+Cls::{true}();
+Cls::{false}();
+Cls::{null}();
+
 ?>
---EXPECT--
-done
+--EXPECTF--
+Fatal error: Method name must be a string in %sbug60611.php on line %d

Modified: php/php-src/branches/PHP_5_4/Zend/zend_compile.c
===================================================================
--- php/php-src/branches/PHP_5_4/Zend/zend_compile.c    2011-12-28 04:31:21 UTC 
(rev 321457)
+++ php/php-src/branches/PHP_5_4/Zend/zend_compile.c    2011-12-28 06:46:12 UTC 
(rev 321458)
@@ -1975,8 +1975,9 @@
                        zval name;
                        name = CONSTANT(last_op->op2.constant);
                        if (Z_TYPE(name) != IS_STRING) {
-                               convert_to_string(&name);
-                       } else if (!IS_INTERNED(Z_STRVAL(name))) {
+                               zend_error(E_COMPILE_ERROR, "Method name must 
be a string");
+                       }
+                       if (!IS_INTERNED(Z_STRVAL(name))) {
                                Z_STRVAL(name) = estrndup(Z_STRVAL(name), 
Z_STRLEN(name));
                        }
                        FREE_POLYMORPHIC_CACHE_SLOT(last_op->op2.constant);
@@ -2369,8 +2370,8 @@

        if (method_name->op_type == IS_CONST) {
                char *lcname;
-               if (Z_TYPE(method_name->u.constant) !=  IS_STRING) {
-                       convert_to_string(&method_name->u.constant);
+               if (Z_TYPE(method_name->u.constant) != IS_STRING) {
+                       zend_error(E_COMPILE_ERROR, "Method name must be a 
string");
                }
                lcname = 
zend_str_tolower_dup(Z_STRVAL(method_name->u.constant), 
Z_STRLEN(method_name->u.constant));
                if ((sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) == 
Z_STRLEN(method_name->u.constant) &&

Modified: php/php-src/trunk/Zend/tests/bug60611.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/bug60611.phpt  2011-12-28 04:31:21 UTC (rev 
321457)
+++ php/php-src/trunk/Zend/tests/bug60611.phpt  2011-12-28 06:46:12 UTC (rev 
321458)
@@ -9,12 +9,6 @@
        }
 }

-Cls::{0}();
-Cls::{1.0}();
-Cls::{true}();
-Cls::{false}();
-Cls::{null}();
-
 $cls = new Cls;
 $cls->{0}();
 $cls->{1.0}();
@@ -22,7 +16,12 @@
 $cls->{false}();
 $cls->{null}();

-echo "done";
+Cls::{0}();
+Cls::{1.0}();
+Cls::{true}();
+Cls::{false}();
+Cls::{null}();
+
 ?>
---EXPECT--
-done
+--EXPECTF--
+Fatal error: Method name must be a string in %sbug60611.php on line %d

Modified: php/php-src/trunk/Zend/zend_compile.c
===================================================================
--- php/php-src/trunk/Zend/zend_compile.c       2011-12-28 04:31:21 UTC (rev 
321457)
+++ php/php-src/trunk/Zend/zend_compile.c       2011-12-28 06:46:12 UTC (rev 
321458)
@@ -1975,8 +1975,9 @@
                        zval name;
                        name = CONSTANT(last_op->op2.constant);
                        if (Z_TYPE(name) != IS_STRING) {
-                               convert_to_string(&name);
-                       } else if (!IS_INTERNED(Z_STRVAL(name))) {
+                               zend_error(E_COMPILE_ERROR, "Method name must 
be a string");
+                       }
+                       if (!IS_INTERNED(Z_STRVAL(name))) {
                                Z_STRVAL(name) = estrndup(Z_STRVAL(name), 
Z_STRLEN(name));
                        }
                        FREE_POLYMORPHIC_CACHE_SLOT(last_op->op2.constant);
@@ -2369,8 +2370,8 @@

        if (method_name->op_type == IS_CONST) {
                char *lcname;
-               if (Z_TYPE(method_name->u.constant) !=  IS_STRING) {
-                       convert_to_string(&method_name->u.constant);
+               if (Z_TYPE(method_name->u.constant) != IS_STRING) {
+                       zend_error(E_COMPILE_ERROR, "Method name must be a 
string");
                }
                lcname = 
zend_str_tolower_dup(Z_STRVAL(method_name->u.constant), 
Z_STRLEN(method_name->u.constant));
                if ((sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) == 
Z_STRLEN(method_name->u.constant) &&

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to