Re: Warnings in include files suddenly treated as fatal
| From: | Ilia Alshanetsky | Date: | Fri, 30 Jan 2004 18:37:52 +0000 |
| Subject: | Re: Warnings in include files suddenly treated as fatal | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-7432@lists.php.net to get a copy of this message | ||
Here is the ZE1 revision.
Ilia
On January 30, 2004 01:21 pm, you wrote:
> On Fri, 30 Jan 2004, Ilia Alshanetsky wrote:
> > Here is the final revision of the patch for the situation, if there are
> > no last minute objections, it'll go in the CVS and we'll proceed with
> > RC2.
>
> Uh, that is a ZE2 patch. We are talking about PHP 4.3.5 RC2 here.
>
> -Rasmus
Index: zend_execute.c =================================================================== RCS file: /repository/Zend/Attic/zend_execute.c,v retrieving revision 1.316.2.28 diff -u -3 -p -r1.316.2.28 zend_execute.c --- zend_execute.c 30 Jan 2004 02:22:31 -0000 1.316.2.28 +++ zend_execute.c 30 Jan 2004 18:37:21 -0000 @@ -2152,7 +2152,24 @@ send_by_ref: case ZEND_REQUIRE: new_op_array = compile_filename(EX(opline)->op2.u.constant.value.lval, inc_filename TSRMLS_CC); if (!new_op_array) { - zend_error(E_ERROR, "Parse error inside included file."); + /* small optimization for require() */ + if (EX(opline)->opcode == ZEND_REQUIRE) { + goto fatal_error; + } else { + /* This check is needed to ensure that included file has a parse error + * and we are no dealing with a non-existant include, which is not considered + * to be a fatal error. + */ + zend_file_handle file_handle = {0}; + int can_open = (zend_open(inc_filename->value.str.val, &file_handle) == SUCCESS && ZEND_IS_VALID_FILE_HANDLE(&file_handle)); + zend_file_handle_dtor(&file_handle); + + /* file open succeeded but still no op-array, likely parse error */ + if (can_open) { +fatal_error: + zend_error(E_ERROR, "Parse error inside included file."); + } + } } break; case ZEND_EVAL: {
Index: zend_execute.c =================================================================== RCS file: /repository/Zend/Attic/zend_execute.c,v retrieving revision 1.316.2.28 diff -u -3 -p -r1.316.2.28 zend_execute.c --- zend_execute.c 30 Jan 2004 02:22:31 -0000 1.316.2.28 +++ zend_execute.c 30 Jan 2004 18:37:21 -0000 @@ -2152,7 +2152,24 @@ send_by_ref: case ZEND_REQUIRE: new_op_array = compile_filename(EX(opline)->op2.u.constant.value.lval, inc_filename TSRMLS_CC); if (!new_op_array) { - zend_error(E_ERROR, "Parse error inside included file."); + /* small optimization for require() */ + if (EX(opline)->opcode == ZEND_REQUIRE) { + goto fatal_error; + } else { + /* This check is needed to ensure that included file has a parse error + * and we are no dealing with a non-existant include, which is not considered + * to be a fatal error. + */ + zend_file_handle file_handle = {0}; + int can_open = (zend_open(inc_filename->value.str.val, &file_handle) == SUCCESS && ZEND_IS_VALID_FILE_HANDLE(&file_handle)); + zend_file_handle_dtor(&file_handle); + + /* file open succeeded but still no op-array, likely parse error */ + if (can_open) { +fatal_error: + zend_error(E_ERROR, "Parse error inside included file."); + } + } } break; case ZEND_EVAL: {