mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fix race conditions with Apache vhost vs. per dir config
If the same php_value/php_flag is present in httpd.conf and .htaccess,
the key is potentially shared between threads. Unfortunately we can't
intern these keys using the current mechanism, because the MPM is setup
before the SAPI module setup is even started. A more elegant way were
to implement a kind of string pool for the thread safe Apache SAPI
config directives with the mechanism similar to what is done for the
SAPI setup now, but doing a separate management.
(cherry picked from commit 73eb5a78b9
)
This commit is contained in:
parent
fe2ac52d50
commit
bced074124
1 changed files with 18 additions and 0 deletions
|
@ -147,10 +147,28 @@ void config_entry_ctor(zval *zv)
|
|||
void *merge_php_config(apr_pool_t *p, void *base_conf, void *new_conf)
|
||||
{
|
||||
php_conf_rec *d = base_conf, *e = new_conf, *n = NULL;
|
||||
#ifdef ZTS
|
||||
zend_string *str;
|
||||
zval *data;
|
||||
#endif
|
||||
|
||||
n = create_php_config(p, "merge_php_config");
|
||||
/* copy old config */
|
||||
#ifdef ZTS
|
||||
ZEND_HASH_FOREACH_STR_KEY_VAL(&d->config, str, data) {
|
||||
zend_string *key;
|
||||
zval *new_entry;
|
||||
|
||||
/* Avoid sharing the non interned string among threads. */
|
||||
key = zend_string_dup(str, 1);
|
||||
|
||||
new_entry = zend_hash_add(&n->config, key, data);
|
||||
|
||||
config_entry_ctor(new_entry);
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
#else
|
||||
zend_hash_copy(&n->config, &d->config, config_entry_ctor);
|
||||
#endif
|
||||
/* merge new config */
|
||||
phpapdebug((stderr, "Merge dir (%p)+(%p)=(%p)\n", base_conf, new_conf, n));
|
||||
zend_hash_merge_ex(&n->config, &e->config, config_entry_ctor, should_overwrite_per_dir_entry, NULL);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue