diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 8900a5f416f53..abffc566e85e9 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -311,6 +311,7 @@ struct _zend_executor_globals { #define EG_FLAGS_IN_SHUTDOWN (1<<0) #define EG_FLAGS_OBJECT_STORE_NO_REUSE (1<<1) #define EG_FLAGS_IN_RESOURCE_SHUTDOWN (1<<2) +#define EG_FLAGS_IN_EXECUTOR_SHUTDOWN (1<<3) struct _zend_ini_scanner_globals { zend_file_handle *yy_in; diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 6bff2ad984d02..d4de3c34eb0ba 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -1204,6 +1204,10 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func CWD_API zend_result virtual_chdir(const char *path) /* {{{ */ { + if (CWDG(cwd).cwd == NULL) { + return FAILURE; + } + return virtual_file_ex(&CWDG(cwd), path, php_is_dir_ok, CWD_REALPATH) ? FAILURE : SUCCESS; } /* }}} */ diff --git a/main/main.c b/main/main.c index 60e970b76ad76..6a9cd1c403bb3 100644 --- a/main/main.c +++ b/main/main.c @@ -1846,7 +1846,11 @@ void php_request_shutdown(void *dummy) { bool report_memleaks; - EG(flags) |= EG_FLAGS_IN_SHUTDOWN; + if (EG(flags) & EG_FLAGS_IN_EXECUTOR_SHUTDOWN) { + return; + } + + EG(flags) |= EG_FLAGS_IN_SHUTDOWN | EG_FLAGS_IN_EXECUTOR_SHUTDOWN; report_memleaks = PG(report_memleaks); diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c index a5d4e8984a5a8..871844c292df3 100644 --- a/sapi/apache2handler/sapi_apache2.c +++ b/sapi/apache2handler/sapi_apache2.c @@ -592,6 +592,7 @@ static int php_handler(request_rec *r) apr_bucket *bucket; apr_status_t rv; request_rec * volatile parent_req = NULL; + JMP_BUF *parent_bailout = NULL; #ifdef ZTS /* initial resource fetch */ (void)ts_resource(0); @@ -665,6 +666,10 @@ static int php_handler(request_rec *r) ap_add_cgi_vars(r); } + if (parent_bailout == NULL && parent_req && EG(bailout)) { + parent_bailout = EG(bailout); + } + zend_first_try { if (ctx == NULL) { @@ -749,6 +754,10 @@ zend_first_try { ctx->r = parent_req; } + if (parent_bailout) { + EG(bailout) = parent_bailout; + } + return OK; }