diff --git a/Zend/tests/oom_compile_failure.phpt b/Zend/tests/oom_compile_failure.phpt new file mode 100644 index 000000000000..c2902ac566a7 --- /dev/null +++ b/Zend/tests/oom_compile_failure.phpt @@ -0,0 +1,22 @@ +--TEST-- +OOM: Delayed OOM raised during compilation of the main script is reported when compilation fails +--SKIPIF-- + +--FILE-- +&1'); + +?> +--CLEAN-- + +--EXPECTF-- +Fatal error: Allowed memory size of 6291456 bytes exhausted %S(tried to allocate %d bytes) in %soom_compile_failure.test.php on line 2 diff --git a/Zend/tests/oom_compile_failure_eval_string.phpt b/Zend/tests/oom_compile_failure_eval_string.phpt new file mode 100644 index 000000000000..2858e7ee86d3 --- /dev/null +++ b/Zend/tests/oom_compile_failure_eval_string.phpt @@ -0,0 +1,18 @@ +--TEST-- +OOM: Delayed OOM raised during compilation of php -r code is reported when compilation fails +--SKIPIF-- + +--FILE-- +&1'); + +?> +--EXPECTF-- +Fatal error: Allowed memory size of 3145728 bytes exhausted %S(tried to allocate %d bytes) in Command line code on line 1 diff --git a/Zend/tests/oom_compile_failure_lint.phpt b/Zend/tests/oom_compile_failure_lint.phpt new file mode 100644 index 000000000000..329f5d0acef9 --- /dev/null +++ b/Zend/tests/oom_compile_failure_lint.phpt @@ -0,0 +1,29 @@ +--TEST-- +OOM: Delayed OOM raised during compilation is reported by php -l +--SKIPIF-- + +--FILE-- +&1'); +} + +?> +--CLEAN-- + +--EXPECTF-- +Fatal error: Allowed memory size of 6291456 bytes exhausted %S(tried to allocate %d bytes) in %soom_compile_failure_lint.test.php on line 2 +Errors parsing %soom_compile_failure_lint.test.php + +Fatal error: Allowed memory size of 6291456 bytes exhausted %S(tried to allocate %d bytes) in %soom_compile_failure_lint.test.php on line 2 +Errors parsing %soom_compile_failure_lint.test.php diff --git a/Zend/zend.c b/Zend/zend.c index 32028c9c5a0e..6c13f60986b8 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1956,8 +1956,14 @@ ZEND_API zend_result zend_execute_script(int type, zval *retval, zend_file_handl zend_destroy_static_vars(op_array); destroy_op_array(op_array); efree_size(op_array, sizeof(zend_op_array)); - } else if (type == ZEND_REQUIRE) { - ret = FAILURE; + } else { + if (EG(delayed_oom).state == ZEND_OOM_STATE_PENDING) { + zend_clear_exception(); + zend_handle_delayed_oom(); + } + if (type == ZEND_REQUIRE) { + ret = FAILURE; + } } return ret; diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 30eb6ec8af3d..4083eae198cf 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1410,6 +1410,10 @@ ZEND_API zend_result zend_eval_stringl(const char *str, size_t str_len, zval *re efree_size(new_op_array, sizeof(zend_op_array)); retval = SUCCESS; } else { + if (EG(delayed_oom).state == ZEND_OOM_STATE_PENDING) { + zend_clear_exception(); + zend_handle_delayed_oom(); + } retval = FAILURE; } zend_string_release(code_str); diff --git a/main/main.c b/main/main.c index bc1725fa9bfd..6279a110ae45 100644 --- a/main/main.c +++ b/main/main.c @@ -2771,6 +2771,11 @@ PHPAPI zend_result php_lint_script(zend_file_handle *file) efree(op_array); retval = SUCCESS; } + if (EG(delayed_oom).state == ZEND_OOM_STATE_PENDING) { + retval = FAILURE; + zend_clear_exception(); + zend_handle_delayed_oom(); + } } zend_end_try(); if (EG(exception)) { zend_exception_error(EG(exception), E_ERROR); diff --git a/sapi/fuzzer/fuzzer-sapi.c b/sapi/fuzzer/fuzzer-sapi.c index 107283c84b41..6c40e572710d 100644 --- a/sapi/fuzzer/fuzzer-sapi.c +++ b/sapi/fuzzer/fuzzer-sapi.c @@ -284,6 +284,9 @@ int fuzzer_do_request_from_buffer( zend_destroy_static_vars(op_array); destroy_op_array(op_array); efree(op_array); + } else if (EG(delayed_oom).state == ZEND_OOM_STATE_PENDING) { + zend_clear_exception(); + zend_handle_delayed_oom(); } } zend_end_try();