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