mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Merge branch 'PHP-7.4'
* PHP-7.4: Properly propagate url_stat exceptions during include
This commit is contained in:
commit
d5c886ab7d
7 changed files with 60 additions and 10 deletions
|
@ -11,14 +11,12 @@ set_error_handler(function($errno, $errstr, $errfile, $errline){
|
|||
require 'notfound.php';
|
||||
--EXPECTF--
|
||||
error(require(notfound.php): failed to open stream: %s)
|
||||
Warning: Uncaught Exception: Foo in %sbug60909_1.php:5
|
||||
Fatal error: Uncaught Exception: Foo in %sbug60909_1.php:5
|
||||
Stack trace:
|
||||
#0 %sbug60909_1.php(8): {closure}(2, 'require(notfoun...', '%s', 8)
|
||||
#1 %sbug60909_1.php(8): require()
|
||||
#2 {main}
|
||||
thrown in %sbug60909_1.php on line 5
|
||||
|
||||
Fatal error: main(): Failed opening required 'notfound.php' (include_path='%s') in %sbug60909_1.php on line 8
|
||||
|
||||
|
||||
!!!shutdown!!!
|
||||
|
|
41
Zend/tests/exception_during_include_stat.phpt
Normal file
41
Zend/tests/exception_during_include_stat.phpt
Normal file
|
@ -0,0 +1,41 @@
|
|||
--TEST--
|
||||
Make sure exceptions during include/require stating are properly propagated
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class StreamWrapper {
|
||||
public function url_stat($path, $flags) {
|
||||
throw new Exception('stat failed');
|
||||
}
|
||||
}
|
||||
|
||||
stream_wrapper_register('test', StreamWrapper::class);
|
||||
set_include_path('test://foo:test://bar');
|
||||
|
||||
try {
|
||||
require_once 'doesnt_exist.php';
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
try {
|
||||
require 'doesnt_exist.php';
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
try {
|
||||
include_once 'doesnt_exist.php';
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
try {
|
||||
include 'doesnt_exist.php';
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
stat failed
|
||||
stat failed
|
||||
stat failed
|
||||
stat failed
|
|
@ -4159,6 +4159,8 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
|
|||
if (zend_hash_exists(&EG(included_files), resolved_path)) {
|
||||
goto already_compiled;
|
||||
}
|
||||
} else if (UNEXPECTED(EG(exception))) {
|
||||
break;
|
||||
} else if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) {
|
||||
zend_message_dispatcher(
|
||||
(type == ZEND_INCLUDE_ONCE) ?
|
||||
|
|
|
@ -637,11 +637,13 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type)
|
|||
zend_save_lexical_state(&original_lex_state);
|
||||
|
||||
if (open_file_for_scanning(file_handle)==FAILURE) {
|
||||
if (type==ZEND_REQUIRE) {
|
||||
zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
|
||||
zend_bailout();
|
||||
} else {
|
||||
zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
|
||||
if (!EG(exception)) {
|
||||
if (type==ZEND_REQUIRE) {
|
||||
zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
|
||||
zend_bailout();
|
||||
} else {
|
||||
zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
op_array = zend_compile(ZEND_USER_FUNCTION);
|
||||
|
|
|
@ -16,6 +16,4 @@ try {
|
|||
Warning: main(): unable to create or locate filter "sample.filter" in %s on line %d
|
||||
|
||||
Warning: main(): Unable to create filter (sample.filter) in %s on line %d
|
||||
|
||||
Warning: main(): Failed opening '%s' for inclusion (include_path='%s') in %s on line %d
|
||||
Undefined constant 'FOO'
|
||||
|
|
|
@ -559,6 +559,9 @@ PHPAPI zend_string *php_resolve_path(const char *filename, size_t filename_lengt
|
|||
if (SUCCESS == wrapper->wops->url_stat(wrapper, trypath, 0, &ssb, NULL)) {
|
||||
return zend_string_init(trypath, strlen(trypath), 0);
|
||||
}
|
||||
if (EG(exception)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
@ -596,6 +599,9 @@ PHPAPI zend_string *php_resolve_path(const char *filename, size_t filename_lengt
|
|||
if (SUCCESS == wrapper->wops->url_stat(wrapper, trypath, 0, &ssb, NULL)) {
|
||||
return zend_string_init(trypath, strlen(trypath), 0);
|
||||
}
|
||||
if (EG(exception)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -2067,6 +2067,9 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
|
|||
options |= STREAM_ASSUME_REALPATH;
|
||||
options &= ~USE_PATH;
|
||||
}
|
||||
if (EG(exception)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
path_to_open = path;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue