diff options
author | Moriyoshi Koizumi <moriyoshi@php.net> | 2005-02-21 15:14:02 (GMT) |
---|---|---|
committer | Moriyoshi Koizumi <moriyoshi@php.net> | 2005-02-21 15:14:02 (GMT) |
commit | 0d7845384fe62648f1feb6336449144f9416a80f (patch) | |
tree | ccc5adcdeb1222696f33645ce4332bb295537241 /main | |
parent | 38dfd6886d920601cdf122048a90cd857b71a8a1 (diff) | |
download | php-0d7845384fe62648f1feb6336449144f9416a80f.tar.gz |
- Fix bug #28568 (known_post_content_types is not thread safe).
# What is eventually necessiated is entire SAPI redesign, I think.
Diffstat (limited to 'main')
-rw-r--r-- | main/SAPI.c | 40 | ||||
-rw-r--r-- | main/SAPI.h | 7 | ||||
-rw-r--r-- | main/main.c | 2 | ||||
-rw-r--r-- | main/php_content_types.c | 4 | ||||
-rw-r--r-- | main/php_content_types.h | 2 |
5 files changed, 35 insertions, 20 deletions
diff --git a/main/SAPI.c b/main/SAPI.c index a729eb5..c87d585 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -51,8 +51,6 @@ #include "php_content_types.h" -static HashTable known_post_content_types; - #ifdef ZTS SAPI_API int sapi_globals_id; #else @@ -62,6 +60,13 @@ sapi_globals_struct sapi_globals; static void sapi_globals_ctor(sapi_globals_struct *sapi_globals TSRMLS_DC) { memset(sapi_globals, 0, sizeof(*sapi_globals)); + zend_hash_init_ex(&sapi_globals->known_post_content_types, 5, + NULL, NULL, 1, 0); +} + +static void sapi_globals_dtor(sapi_globals_struct *sapi_globals TSRMLS_DC) +{ + zend_hash_destroy(&sapi_globals->known_post_content_types); } /* True globals (no need for thread safety) */ @@ -71,11 +76,11 @@ SAPI_API sapi_module_struct sapi_module; SAPI_API void sapi_startup(sapi_module_struct *sf) { sapi_module = *sf; - zend_hash_init_ex(&known_post_content_types, 5, NULL, NULL, 1, 0); #ifdef ZTS - ts_allocate_id(&sapi_globals_id, sizeof(sapi_globals_struct), (ts_allocate_ctor) sapi_globals_ctor, NULL); + ts_allocate_id(&sapi_globals_id, sizeof(sapi_globals_struct), (ts_allocate_ctor) sapi_globals_ctor, (ts_allocate_dtor) sapi_globals_dtor); #else + TSRMLS_FETCH(); sapi_globals_ctor(&sapi_globals TSRMLS_CC); #endif @@ -90,6 +95,13 @@ SAPI_API void sapi_startup(sapi_module_struct *sf) SAPI_API void sapi_shutdown(void) { +#ifdef ZTS + ts_free_id(&sapi_globals_id); +#else + TSRMLS_FETCH(); + sapi_globals_dtor(&sapi_globals TSRMLS_CC); +#endif + reentrancy_shutdown(); virtual_cwd_shutdown(); @@ -97,8 +109,6 @@ SAPI_API void sapi_shutdown(void) #ifdef PHP_WIN32 tsrm_win32_shutdown(); #endif - - zend_hash_destroy(&known_post_content_types); } @@ -151,7 +161,8 @@ static void sapi_read_post_data(TSRMLS_D) } /* now try to find an appropriate POST content handler */ - if (zend_hash_find(&known_post_content_types, content_type, content_type_length+1, (void **) &post_entry) == SUCCESS) { + if (zend_hash_find(&SG(known_post_content_types), content_type, + content_type_length+1, (void **) &post_entry) == SUCCESS) { /* found one, register it for use */ SG(request_info).post_entry = post_entry; post_reader_func = post_entry->post_reader; @@ -802,12 +813,12 @@ SAPI_API int sapi_send_headers(TSRMLS_D) } -SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entries) +SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entries TSRMLS_DC) { sapi_post_entry *p=post_entries; while (p->content_type) { - if (sapi_register_post_entry(p) == FAILURE) { + if (sapi_register_post_entry(p TSRMLS_CC) == FAILURE) { return FAILURE; } p++; @@ -816,14 +827,17 @@ SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entries) } -SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry) +SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry TSRMLS_DC) { - return zend_hash_add(&known_post_content_types, post_entry->content_type, post_entry->content_type_len+1, (void *) post_entry, sizeof(sapi_post_entry), NULL); + return zend_hash_add(&SG(known_post_content_types), + post_entry->content_type, post_entry->content_type_len+1, + (void *) post_entry, sizeof(sapi_post_entry), NULL); } -SAPI_API void sapi_unregister_post_entry(sapi_post_entry *post_entry) +SAPI_API void sapi_unregister_post_entry(sapi_post_entry *post_entry TSRMLS_DC) { - zend_hash_del(&known_post_content_types, post_entry->content_type, post_entry->content_type_len+1); + zend_hash_del(&SG(known_post_content_types), post_entry->content_type, + post_entry->content_type_len+1); } diff --git a/main/SAPI.h b/main/SAPI.h index 11965fc..ca6836a 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -126,6 +126,7 @@ typedef struct _sapi_globals_struct { int options; zend_bool sapi_started; time_t global_request_time; + HashTable known_post_content_types; } sapi_globals_struct; @@ -180,9 +181,9 @@ SAPI_API int sapi_send_headers(TSRMLS_D); SAPI_API void sapi_free_header(sapi_header_struct *sapi_header); SAPI_API void sapi_handle_post(void *arg TSRMLS_DC); -SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entry); -SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry); -SAPI_API void sapi_unregister_post_entry(sapi_post_entry *post_entry); +SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entry TSRMLS_DC); +SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry TSRMLS_DC); +SAPI_API void sapi_unregister_post_entry(sapi_post_entry *post_entry TSRMLS_DC); SAPI_API int sapi_register_default_post_reader(void (*default_post_reader)(TSRMLS_D)); SAPI_API int sapi_register_treat_data(void (*treat_data)(int arg, char *str, zval *destArray TSRMLS_DC)); SAPI_API int sapi_register_input_filter(unsigned int (*input_filter)(int arg, char *var, char **val, unsigned int val_len, unsigned int *new_val_len TSRMLS_DC)); diff --git a/main/main.c b/main/main.c index 66df888..fd52837 100644 --- a/main/main.c +++ b/main/main.c @@ -1415,7 +1415,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod zuv.import_use_extension = ".php"; php_startup_auto_globals(TSRMLS_C); zend_set_utility_values(&zuv); - php_startup_sapi_content_types(); + php_startup_sapi_content_types(TSRMLS_C); REGISTER_MAIN_STRINGL_CONSTANT("PHP_VERSION", PHP_VERSION, sizeof(PHP_VERSION)-1, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_STRINGL_CONSTANT("PHP_OS", php_os, strlen(php_os), CONST_PERSISTENT | CONST_CS); diff --git a/main/php_content_types.c b/main/php_content_types.c index 3dfabf8..bf9ad54 100644 --- a/main/php_content_types.c +++ b/main/php_content_types.c @@ -72,9 +72,9 @@ SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader) /* {{{ php_startup_sapi_content_types */ -int php_startup_sapi_content_types(void) +int php_startup_sapi_content_types(TSRMLS_D) { - sapi_register_post_entries(php_post_entries); + sapi_register_post_entries(php_post_entries TSRMLS_CC); sapi_register_default_post_reader(php_default_post_reader); sapi_register_treat_data(php_default_treat_data); sapi_register_input_filter(php_default_input_filter); diff --git a/main/php_content_types.h b/main/php_content_types.h index deab927..e04f6dc 100644 --- a/main/php_content_types.h +++ b/main/php_content_types.h @@ -25,6 +25,6 @@ SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader); SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler); -int php_startup_sapi_content_types(void); +int php_startup_sapi_content_types(TSRMLS_D); #endif /* PHP_CONTENT_TYPES_H */ |