From 87e3b2d46597b00bc1640f60b5debe4e8e96bdae Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 21 May 2026 16:23:39 +0200 Subject: [PATCH 1/2] Fix memory corruption of INIs in ZTS builds The preloading skip was lost during the last refactor; putting it back. --- zend_abstract_interface/config/config_ini.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zend_abstract_interface/config/config_ini.c b/zend_abstract_interface/config/config_ini.c index 531a10a164..1f3ad63c65 100644 --- a/zend_abstract_interface/config/config_ini.c +++ b/zend_abstract_interface/config/config_ini.c @@ -396,7 +396,7 @@ void zai_config_ini_rinit(void) { #if ZTS // Skip during preloading, in that case EG(ini_directives) is the actual source of truth (NTS-like) - if (env_to_ini_name && !inis_synchronized && zai_config_first_rinit_done) { + if (env_to_ini_name && !inis_synchronized && zai_config_first_rinit_done && !in_startup) { for (uint16_t i = 0; i < zai_config_memoized_entries_count; ++i) { zai_config_memoized_entry *memoized = &zai_config_memoized_entries[i]; if (!memoized->original_on_modify) { From 7d1d6331972f780527304276b49e49a2c99e4c51 Mon Sep 17 00:00:00 2001 From: Florian Engelhardt Date: Fri, 22 May 2026 14:19:36 +0200 Subject: [PATCH 2/2] Update zend_abstract_interface/config/config_ini.c --- zend_abstract_interface/config/config_ini.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zend_abstract_interface/config/config_ini.c b/zend_abstract_interface/config/config_ini.c index 1f3ad63c65..5e58f1f032 100644 --- a/zend_abstract_interface/config/config_ini.c +++ b/zend_abstract_interface/config/config_ini.c @@ -405,6 +405,9 @@ void zai_config_ini_rinit(void) { zend_ini_entry *source = memoized->ini_entries[n], *ini = zend_hash_find_ptr(EG(ini_directives), source->name); // On ZTS INIs must be not shared between threads (otherwise: refcount race conditions). Hence we dup them rather than just copy. + ZEND_ASSERT(ini && source); + ZEND_ASSERT(ini != source && "ZTS INI sync must not run against the global INI table"); + ZEND_ASSERT(ini->value != source->value && "ZTS INI values must not be shared before syncing"); if (ini->modified) { bool identical_orig = ini->orig_value == ini->value; zend_string_release(ini->orig_value);