From: Dmitry Stogov Date: Thu, 11 Jan 2007 16:47:46 +0000 (+0000) Subject: Fixed bug #35634 (Erroneous "Class declarations may not be nested" error raised)... X-Git-Tag: RELEASE_1_0_0RC1~301 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c849a54b024eee548dd91db5c2fbc418153cd3dd;p=php Fixed bug #35634 (Erroneous "Class declarations may not be nested" error raised). (Carl P. Corliss) --- diff --git a/Zend/tests/bug35634.phpt b/Zend/tests/bug35634.phpt new file mode 100755 index 0000000000..9681b6ad40 --- /dev/null +++ b/Zend/tests/bug35634.phpt @@ -0,0 +1,36 @@ +--TEST-- +Bug #35634 (Erroneous "Class declarations may not be nested" error raised) +--INI-- +error_reporting=0 +--FILE-- +__construct(); + } + } + +} else { + + function errorHandler($errorNumber, $errorMessage, $fileName, $lineNumber) { + define("pass3", 1); + include(__FILE__); + die("Error: $errorMessage ($fileName:$lineNumber)\n"); + } + + set_error_handler('errorHandler'); + define("pass2", 1); + include(__FILE__); +} +?> +--EXPECTF-- +Error: Redefining already defined constructor for class TestClass (%sbug35634.php:12) diff --git a/Zend/zend.c b/Zend/zend.c index e9f2c59726..fbc9d638ce 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1391,6 +1391,8 @@ ZEND_API void zend_error(int type, const char *format, ...) char *error_filename; uint error_lineno; zval *orig_user_error_handler; + zend_bool in_compilation; + zend_class_entry *saved_class_entry; TSRMLS_FETCH(); /* Obtain relevant filename and lineno */ @@ -1504,6 +1506,17 @@ ZEND_API void zend_error(int type, const char *format, ...) orig_user_error_handler = EG(user_error_handler); EG(user_error_handler) = NULL; + /* User error handler may include() additinal PHP files. + * If an error was generated during comilation PHP will compile + * such scripts recursivly, but some CG() variables may be + * inconsistent. */ + + in_compilation = zend_is_compiling(TSRMLS_C); + if (in_compilation) { + saved_class_entry = CG(active_class_entry); + CG(active_class_entry) = NULL; + } + if (call_user_function_ex(CG(function_table), NULL, orig_user_error_handler, &retval, 5, params, 1, NULL TSRMLS_CC)==SUCCESS) { if (retval) { if (Z_TYPE_P(retval) == IS_BOOL && Z_LVAL_P(retval) == 0) { @@ -1516,6 +1529,10 @@ ZEND_API void zend_error(int type, const char *format, ...) zend_error_cb(type, error_filename, error_lineno, format, args); } + if (in_compilation) { + CG(active_class_entry) = saved_class_entry; + } + if (!EG(user_error_handler)) { EG(user_error_handler) = orig_user_error_handler; }