RE: [PHP-DEV] 5.2.4RC1 Released
| From: | Uwe Schindler | Date: | Fri, 03 Aug 2007 14:50:11 +0000 |
| Subject: | RE: [PHP-DEV] 5.2.4RC1 Released | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-31429@lists.php.net to get a copy of this message | ||
> > On 3-Aug-07, at 9:51 AM, Uwe Schindler wrote:
> >
> > >> This's a special case and it's really great you noticed it in RC..
> > >> We need a workaround for this special case, as if we make all INI
> > >> directives set
> > >> using php_admin_value non-changeable, we break the @ thing.
> > >> So we either need to change the @ not to use zend_alter_ini_entry,
> > >> or make
> > >> an
> > >> exception in that function, which I believe would be a hack.
> > >
> > > Thats correct. An idea would be to make the @ operator only change
> > > EG(error_reporting) without changing the whole ini-entry by
> > > alter_ini_entry
> > > (which is a big slowdown...).
> >
> > The problem with that fix that a crash would potentially leave the
> > error blocking on, and INI clean up will not reset it.
>
> The problem with the original fix of antony was the same: The first time
> any
> thread started to modify any INI entry it was marked as "admin"-only for
> the
> whole PHP server until a restart and it stayed in that state because the
> flag was changed *before* the hash table was replicated. This is a second
> bug. So at least the lines of antony must moved a few lines down in
> code...
I attached a patch. This patch must be applied in all cases. A second thing
is to remove breakage of the @ operator.
Uwe
Index: zend_ini.c =================================================================== RCS file: /repository/ZendEngine2/zend_ini.c,v retrieving revision 1.39.2.2.2.10 diff -u -r1.39.2.2.2.10 zend_ini.c --- zend_ini.c 17 Jun 2007 14:31:12 -0000 1.39.2.2.2.10 +++ zend_ini.c 3 Aug 2007 14:46:30 -0000 @@ -243,10 +243,6 @@ return FAILURE; } - if (stage == ZEND_INI_STAGE_ACTIVATE && modify_type == ZEND_INI_SYSTEM) { - ini_entry->modifiable = ZEND_INI_SYSTEM; - } - if (!(ini_entry->modifiable & modify_type)) { return FAILURE; } @@ -264,6 +260,10 @@ zend_hash_add(EG(modified_ini_directives), name, name_length, &ini_entry, sizeof(zend_ini_entry*), NULL); } + if (stage == ZEND_INI_STAGE_ACTIVATE && modify_type == ZEND_INI_SYSTEM) { + ini_entry->modifiable = ZEND_INI_SYSTEM; + } + duplicate = estrndup(new_value, new_value_length); if (!ini_entry->on_modify
Index: zend_ini.c =================================================================== RCS file: /repository/ZendEngine2/zend_ini.c,v retrieving revision 1.39.2.2.2.10 diff -u -r1.39.2.2.2.10 zend_ini.c --- zend_ini.c 17 Jun 2007 14:31:12 -0000 1.39.2.2.2.10 +++ zend_ini.c 3 Aug 2007 14:46:30 -0000 @@ -243,10 +243,6 @@ return FAILURE; } - if (stage == ZEND_INI_STAGE_ACTIVATE && modify_type == ZEND_INI_SYSTEM) { - ini_entry->modifiable = ZEND_INI_SYSTEM; - } - if (!(ini_entry->modifiable & modify_type)) { return FAILURE; } @@ -264,6 +260,10 @@ zend_hash_add(EG(modified_ini_directives), name, name_length, &ini_entry, sizeof(zend_ini_entry*), NULL); } + if (stage == ZEND_INI_STAGE_ACTIVATE && modify_type == ZEND_INI_SYSTEM) { + ini_entry->modifiable = ZEND_INI_SYSTEM; + } + duplicate = estrndup(new_value, new_value_length); if (!ini_entry->on_modify