]> granicus.if.org Git - php/commitdiff
Partial fixed bug #79649 (Altering disable_functions from module init corrupts memory)
authorXinchen Hui <laruence@gmail.com>
Wed, 10 Jun 2020 03:16:42 +0000 (11:16 +0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 10 Jun 2020 03:16:42 +0000 (11:16 +0800)
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

NEWS
Zend/zend_ini.c

diff --git a/NEWS b/NEWS
index 9ef7369f93670177f850a79dd036d0427def81c8..b67a16e951576eda27b6f2e7a87d7baa4cb2e3ed 100644 (file)
--- 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,
index e4b9e6bc5e8469884e5472d6534015be42688044..3f4c9d0930c8e7f03d577afe85212379611455f7 100644 (file)
@@ -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);