laruence Tue, 27 Dec 2011 08:38:18 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=321429
Log: Fix bug #60611 (Segmentation fault with Cls::{expr}() syntax) Bug: https://bugs.php.net/60611 (Open) Segmentation fault with Cls::{expr}() syntax Changed paths: U php/php-src/branches/PHP_5_4/NEWS A php/php-src/branches/PHP_5_4/Zend/tests/bug60611.phpt U php/php-src/branches/PHP_5_4/Zend/zend_compile.c A 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/NEWS =================================================================== --- php/php-src/branches/PHP_5_4/NEWS 2011-12-27 06:24:33 UTC (rev 321428) +++ php/php-src/branches/PHP_5_4/NEWS 2011-12-27 08:38:18 UTC (rev 321429) @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? Jan 2012, PHP 5.4.0 RC5 +- Core: + . Fixed bug #60611 (Segmentation fault with Cls::{expr}() syntax). (Laruence) + - CLI SAPI: . Fixed bug #60591 (Memory leak when access a non-exists file). (Laruence) Added: php/php-src/branches/PHP_5_4/Zend/tests/bug60611.phpt =================================================================== --- php/php-src/branches/PHP_5_4/Zend/tests/bug60611.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/Zend/tests/bug60611.phpt 2011-12-27 08:38:18 UTC (rev 321429) @@ -0,0 +1,28 @@ +--TEST-- +Bug #60611 (Segmentation fault with Cls::{expr}() syntax) +--FILE-- +<?php +class Cls { + function __call($name, $arg) { + } + static function __callStatic($name, $arg) { + } +} + +Cls::{0}(); +Cls::{1.0}(); +Cls::{true}(); +Cls::{false}(); +Cls::{null}(); + +$cls = new Cls; +$cls->{0}(); +$cls->{1.0}(); +$cls->{true}(); +$cls->{false}(); +$cls->{null}(); + +echo "done"; +?> +--EXPECT-- +done 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-27 06:24:33 UTC (rev 321428) +++ php/php-src/branches/PHP_5_4/Zend/zend_compile.c 2011-12-27 08:38:18 UTC (rev 321429) @@ -1973,9 +1973,10 @@ if (last_op->opcode == ZEND_FETCH_OBJ_R) { if (last_op->op2_type == IS_CONST) { zval name; - name = CONSTANT(last_op->op2.constant); - if (!IS_INTERNED(Z_STRVAL(name))) { + if (Z_TYPE(name) != IS_STRING) { + convert_to_string(&name); + } else if (!IS_INTERNED(Z_STRVAL(name))) { Z_STRVAL(name) = estrndup(Z_STRVAL(name), Z_STRLEN(name)); } FREE_POLYMORPHIC_CACHE_SLOT(last_op->op2.constant); @@ -2367,7 +2368,11 @@ zend_op *opline; if (method_name->op_type == IS_CONST) { - char *lcname = zend_str_tolower_dup(Z_STRVAL(method_name->u.constant), Z_STRLEN(method_name->u.constant)); + char *lcname; + if (Z_TYPE(method_name->u.constant) != IS_STRING) { + convert_to_string(&method_name->u.constant); + } + 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) && memcmp(lcname, ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) == 0) { zval_dtor(&method_name->u.constant); Added: php/php-src/trunk/Zend/tests/bug60611.phpt =================================================================== --- php/php-src/trunk/Zend/tests/bug60611.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/bug60611.phpt 2011-12-27 08:38:18 UTC (rev 321429) @@ -0,0 +1,28 @@ +--TEST-- +Bug #60611 (Segmentation fault with Cls::{expr}() syntax) +--FILE-- +<?php +class Cls { + function __call($name, $arg) { + } + static function __callStatic($name, $arg) { + } +} + +Cls::{0}(); +Cls::{1.0}(); +Cls::{true}(); +Cls::{false}(); +Cls::{null}(); + +$cls = new Cls; +$cls->{0}(); +$cls->{1.0}(); +$cls->{true}(); +$cls->{false}(); +$cls->{null}(); + +echo "done"; +?> +--EXPECT-- +done Modified: php/php-src/trunk/Zend/zend_compile.c =================================================================== --- php/php-src/trunk/Zend/zend_compile.c 2011-12-27 06:24:33 UTC (rev 321428) +++ php/php-src/trunk/Zend/zend_compile.c 2011-12-27 08:38:18 UTC (rev 321429) @@ -1973,9 +1973,10 @@ if (last_op->opcode == ZEND_FETCH_OBJ_R) { if (last_op->op2_type == IS_CONST) { zval name; - name = CONSTANT(last_op->op2.constant); - if (!IS_INTERNED(Z_STRVAL(name))) { + if (Z_TYPE(name) != IS_STRING) { + convert_to_string(&name); + } else if (!IS_INTERNED(Z_STRVAL(name))) { Z_STRVAL(name) = estrndup(Z_STRVAL(name), Z_STRLEN(name)); } FREE_POLYMORPHIC_CACHE_SLOT(last_op->op2.constant); @@ -2367,7 +2368,11 @@ zend_op *opline; if (method_name->op_type == IS_CONST) { - char *lcname = zend_str_tolower_dup(Z_STRVAL(method_name->u.constant), Z_STRLEN(method_name->u.constant)); + char *lcname; + if (Z_TYPE(method_name->u.constant) != IS_STRING) { + convert_to_string(&method_name->u.constant); + } + 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) && memcmp(lcname, ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) == 0) { zval_dtor(&method_name->u.constant);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php