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