mirror of
https://github.com/php/php-src.git
synced 2024-09-23 02:47:26 +00: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.
This commit is contained in:
parent
5feb53964f
commit
73eb5a78b9
@ -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…
Reference in New Issue
Block a user