mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Merge branch 'PHP-8.3'
* PHP-8.3: Workaround ZTS persistent resource crashes (PHP 8.3 and lower)
This commit is contained in:
commit
6c735739f1
4 changed files with 41 additions and 7 deletions
|
@ -1183,6 +1183,8 @@ void zend_shutdown(void) /* {{{ */
|
||||||
#endif
|
#endif
|
||||||
zend_destroy_rsrc_list_dtors();
|
zend_destroy_rsrc_list_dtors();
|
||||||
|
|
||||||
|
zend_unload_modules();
|
||||||
|
|
||||||
zend_optimizer_shutdown();
|
zend_optimizer_shutdown();
|
||||||
startup_done = false;
|
startup_done = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -279,6 +279,7 @@ void zend_shutdown(void);
|
||||||
void zend_register_standard_ini_entries(void);
|
void zend_register_standard_ini_entries(void);
|
||||||
zend_result zend_post_startup(void);
|
zend_result zend_post_startup(void);
|
||||||
void zend_set_utility_values(zend_utility_values *utility_values);
|
void zend_set_utility_values(zend_utility_values *utility_values);
|
||||||
|
void zend_unload_modules(void);
|
||||||
|
|
||||||
ZEND_API ZEND_COLD ZEND_NORETURN void _zend_bailout(const char *filename, uint32_t lineno);
|
ZEND_API ZEND_COLD ZEND_NORETURN void _zend_bailout(const char *filename, uint32_t lineno);
|
||||||
ZEND_API size_t zend_get_page_size(void);
|
ZEND_API size_t zend_get_page_size(void);
|
||||||
|
|
|
@ -41,6 +41,7 @@ ZEND_API HashTable module_registry;
|
||||||
static zend_module_entry **module_request_startup_handlers;
|
static zend_module_entry **module_request_startup_handlers;
|
||||||
static zend_module_entry **module_request_shutdown_handlers;
|
static zend_module_entry **module_request_shutdown_handlers;
|
||||||
static zend_module_entry **module_post_deactivate_handlers;
|
static zend_module_entry **module_post_deactivate_handlers;
|
||||||
|
static zend_module_entry **modules_dl_loaded;
|
||||||
|
|
||||||
static zend_class_entry **class_cleanup_handlers;
|
static zend_class_entry **class_cleanup_handlers;
|
||||||
|
|
||||||
|
@ -2398,6 +2399,7 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */
|
||||||
int startup_count = 0;
|
int startup_count = 0;
|
||||||
int shutdown_count = 0;
|
int shutdown_count = 0;
|
||||||
int post_deactivate_count = 0;
|
int post_deactivate_count = 0;
|
||||||
|
int dl_loaded_count = 0;
|
||||||
zend_class_entry *ce;
|
zend_class_entry *ce;
|
||||||
int class_count = 0;
|
int class_count = 0;
|
||||||
|
|
||||||
|
@ -2412,6 +2414,9 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */
|
||||||
if (module->post_deactivate_func) {
|
if (module->post_deactivate_func) {
|
||||||
post_deactivate_count++;
|
post_deactivate_count++;
|
||||||
}
|
}
|
||||||
|
if (module->handle) {
|
||||||
|
dl_loaded_count++;
|
||||||
|
}
|
||||||
} ZEND_HASH_FOREACH_END();
|
} ZEND_HASH_FOREACH_END();
|
||||||
module_request_startup_handlers = (zend_module_entry**)realloc(
|
module_request_startup_handlers = (zend_module_entry**)realloc(
|
||||||
module_request_startup_handlers,
|
module_request_startup_handlers,
|
||||||
|
@ -2424,6 +2429,9 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */
|
||||||
module_request_shutdown_handlers[shutdown_count] = NULL;
|
module_request_shutdown_handlers[shutdown_count] = NULL;
|
||||||
module_post_deactivate_handlers = module_request_shutdown_handlers + shutdown_count + 1;
|
module_post_deactivate_handlers = module_request_shutdown_handlers + shutdown_count + 1;
|
||||||
module_post_deactivate_handlers[post_deactivate_count] = NULL;
|
module_post_deactivate_handlers[post_deactivate_count] = NULL;
|
||||||
|
/* Cannot reuse module_request_startup_handlers because it is freed in zend_destroy_modules, which happens before zend_unload_modules. */
|
||||||
|
modules_dl_loaded = realloc(modules_dl_loaded, sizeof(zend_module_entry*) * (dl_loaded_count + 1));
|
||||||
|
modules_dl_loaded[dl_loaded_count] = NULL;
|
||||||
startup_count = 0;
|
startup_count = 0;
|
||||||
|
|
||||||
ZEND_HASH_MAP_FOREACH_PTR(&module_registry, module) {
|
ZEND_HASH_MAP_FOREACH_PTR(&module_registry, module) {
|
||||||
|
@ -2436,6 +2444,9 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */
|
||||||
if (module->post_deactivate_func) {
|
if (module->post_deactivate_func) {
|
||||||
module_post_deactivate_handlers[--post_deactivate_count] = module;
|
module_post_deactivate_handlers[--post_deactivate_count] = module;
|
||||||
}
|
}
|
||||||
|
if (module->handle) {
|
||||||
|
modules_dl_loaded[--dl_loaded_count] = module;
|
||||||
|
}
|
||||||
} ZEND_HASH_FOREACH_END();
|
} ZEND_HASH_FOREACH_END();
|
||||||
|
|
||||||
/* Collect internal classes with static members */
|
/* Collect internal classes with static members */
|
||||||
|
@ -3238,18 +3249,23 @@ void module_destructor(zend_module_entry *module) /* {{{ */
|
||||||
clean_module_functions(module);
|
clean_module_functions(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAVE_LIBDL
|
|
||||||
if (module->handle && !getenv("ZEND_DONT_UNLOAD_MODULES")) {
|
|
||||||
DL_UNLOAD(module->handle);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ZEND_RC_DEBUG
|
#if ZEND_RC_DEBUG
|
||||||
zend_rc_debug = orig_rc_debug;
|
zend_rc_debug = orig_rc_debug;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
void module_registry_unload(const zend_module_entry *module)
|
||||||
|
{
|
||||||
|
#if HAVE_LIBDL
|
||||||
|
if (!getenv("ZEND_DONT_UNLOAD_MODULES")) {
|
||||||
|
DL_UNLOAD(module->handle);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
ZEND_IGNORE_VALUE(module);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
ZEND_API void zend_activate_modules(void) /* {{{ */
|
ZEND_API void zend_activate_modules(void) /* {{{ */
|
||||||
{
|
{
|
||||||
zend_module_entry **p = module_request_startup_handlers;
|
zend_module_entry **p = module_request_startup_handlers;
|
||||||
|
@ -3294,6 +3310,18 @@ ZEND_API void zend_deactivate_modules(void) /* {{{ */
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
void zend_unload_modules(void) /* {{{ */
|
||||||
|
{
|
||||||
|
zend_module_entry **modules = modules_dl_loaded;
|
||||||
|
while (*modules) {
|
||||||
|
module_registry_unload(*modules);
|
||||||
|
modules++;
|
||||||
|
}
|
||||||
|
free(modules_dl_loaded);
|
||||||
|
modules_dl_loaded = NULL;
|
||||||
|
}
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
ZEND_API void zend_post_deactivate_modules(void) /* {{{ */
|
ZEND_API void zend_post_deactivate_modules(void) /* {{{ */
|
||||||
{
|
{
|
||||||
if (EG(full_tables_cleanup)) {
|
if (EG(full_tables_cleanup)) {
|
||||||
|
@ -3312,6 +3340,9 @@ ZEND_API void zend_post_deactivate_modules(void) /* {{{ */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
module_destructor(module);
|
module_destructor(module);
|
||||||
|
if (module->handle) {
|
||||||
|
module_registry_unload(module);
|
||||||
|
}
|
||||||
zend_string_release_ex(key, 0);
|
zend_string_release_ex(key, 0);
|
||||||
} ZEND_HASH_MAP_FOREACH_END_DEL();
|
} ZEND_HASH_MAP_FOREACH_END_DEL();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -125,7 +125,7 @@ extern ZEND_API HashTable module_registry;
|
||||||
|
|
||||||
void module_destructor(zend_module_entry *module);
|
void module_destructor(zend_module_entry *module);
|
||||||
int module_registry_request_startup(zend_module_entry *module);
|
int module_registry_request_startup(zend_module_entry *module);
|
||||||
int module_registry_unload_temp(const zend_module_entry *module);
|
void module_registry_unload(const zend_module_entry *module);
|
||||||
END_EXTERN_C()
|
END_EXTERN_C()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue