From: Xinchen Hui Date: Wed, 10 Jun 2020 03:16:42 +0000 (+0800) Subject: Partial fixed bug #79649 (Altering disable_functions from module init corrupts memory) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a297c09da5ad355d53a8e8ea72655a06d15b7bc7;p=php Partial fixed bug #79649 (Altering disable_functions from module init corrupts memory) In module startup stage, we should not initiliaze EG(modified_ini_directives) as it use zend MM, the zend MM will be restart at the end of modules startup stage, by say "partial", because this issue still exists if altering ZEND_USER inis, we should add a zend_ini_deactive at the end of modules startup stage, but it brings some new cost, and I think no one would do things like that --- diff --git a/NEWS b/NEWS index 9ef7369f93..b67a16e951 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2020, PHP 7.4.8 - Core: + . Fixed bug #79649 (Altering disable_functions from module init corrupts + memory). (Laruence) . Fixed bug #79595 (zend_init_fpu() alters FPU precision). (cmb, Nikita) . Fixed bug #79650 (php-win.exe 100% cpu lockup). (cmb) . Fixed bug #79668 (get_defined_functions(true) may miss functions). (cmb, diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index e4b9e6bc5e..3f4c9d0930 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -341,15 +341,17 @@ ZEND_API int zend_alter_ini_entry_ex(zend_string *name, zend_string *new_value, } } - if (!EG(modified_ini_directives)) { - ALLOC_HASHTABLE(EG(modified_ini_directives)); - zend_hash_init(EG(modified_ini_directives), 8, NULL, NULL, 0); - } - if (!modified) { - ini_entry->orig_value = ini_entry->value; - ini_entry->orig_modifiable = modifiable; - ini_entry->modified = 1; - zend_hash_add_ptr(EG(modified_ini_directives), ini_entry->name, ini_entry); + if (ini_entry->modifiable != ZEND_INI_SYSTEM) { + if (!EG(modified_ini_directives)) { + ALLOC_HASHTABLE(EG(modified_ini_directives)); + zend_hash_init(EG(modified_ini_directives), 8, NULL, NULL, 0); + } + if (!modified) { + ini_entry->orig_value = ini_entry->value; + ini_entry->orig_modifiable = modifiable; + ini_entry->modified = 1; + zend_hash_add_ptr(EG(modified_ini_directives), ini_entry->name, ini_entry); + } } duplicate = zend_string_copy(new_value);