]> granicus.if.org Git - php/commitdiff
- Fix bug #28568 (known_post_content_types is not thread safe).
authorMoriyoshi Koizumi <moriyoshi@php.net>
Mon, 21 Feb 2005 15:14:02 +0000 (15:14 +0000)
committerMoriyoshi Koizumi <moriyoshi@php.net>
Mon, 21 Feb 2005 15:14:02 +0000 (15:14 +0000)
# What is eventually necessiated is entire SAPI redesign, I think.

ext/mbstring/mb_gpc.c
ext/mbstring/mbstring.c
main/SAPI.c
main/SAPI.h
main/main.c
main/php_content_types.c
main/php_content_types.h

index 20729330b72f7138bc2f67fc7525b5faad88ae18..4e55504bd50572ec4f4cb059c9682b0d4134ba6e 100644 (file)
 
 ZEND_EXTERN_MODULE_GLOBALS(mbstring)
 
-/* {{{ static sapi_post_entry mbstr_post_entries[] */
-static sapi_post_entry mbstr_post_entries[] = {
-       { DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_mb_post_handler },
-       { MULTIPART_CONTENT_TYPE,    sizeof(MULTIPART_CONTENT_TYPE)-1,    NULL,                         rfc1867_post_handler },
-       { NULL, 0, NULL, NULL }
-};
-/* }}} */
-
-/* {{{ static sapi_post_entry php_post_entries[] */
-static sapi_post_entry php_post_entries[] = {
-       { DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_std_post_handler },
-       { MULTIPART_CONTENT_TYPE,    sizeof(MULTIPART_CONTENT_TYPE)-1,    NULL,                         rfc1867_post_handler },
-       { NULL, 0, NULL, NULL }
-};
-/* }}} */
-
-/* {{{ int _php_mb_enable_encoding_translation(int flag) */
-int _php_mb_enable_encoding_translation(int flag)
-{
-       if (flag) {
-               sapi_unregister_post_entry(php_post_entries);
-               sapi_register_post_entries(mbstr_post_entries);
-               sapi_register_treat_data(mbstr_treat_data);                                
-       } else {
-               sapi_unregister_post_entry(mbstr_post_entries);
-               sapi_register_post_entries(php_post_entries);
-               sapi_register_treat_data(php_default_treat_data);                                  
-       }
-       return SUCCESS;
-}
-/* }}} */ 
-
 /* {{{ MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
  * http input processing */
 MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
 {
        char *res = NULL, *separator=NULL;
        const char *c_var;
-       pval *array_ptr;
+       zval *array_ptr;
        int free_buffer=0;
        enum mbfl_no_encoding detected;
        php_mb_encoding_handler_info_t info;
 
+       if (!MBSTRG(encoding_translation)) {
+               php_default_treat_data(arg, str, destArray TSRMLS_CC);
+               return;
+       }
+
        switch (arg) {
                case PARSE_POST:
                case PARSE_GET:
index 0988a6607844d0d82fb57e01457cdfbdc825d455..37b4db84c07d26f0e7d8fac56b0e730998347307 100644 (file)
@@ -227,6 +227,14 @@ zend_module_entry mbstring_module_entry = {
 };
 /* }}} */
 
+/* {{{ static sapi_post_entry php_post_entries[] */
+static sapi_post_entry php_post_entries[] = {
+       { DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_std_post_handler },
+       { MULTIPART_CONTENT_TYPE,    sizeof(MULTIPART_CONTENT_TYPE)-1,    NULL,                         rfc1867_post_handler },
+       { NULL, 0, NULL, NULL }
+};
+/* }}} */
+
 ZEND_DECLARE_MODULE_GLOBALS(mbstring)
 
 #ifdef COMPILE_DL_MBSTRING
@@ -283,6 +291,14 @@ static mbfl_allocators _php_mb_allocators = {
 };
 /* }}} */
 
+/* {{{ static sapi_post_entry mbstr_post_entries[] */
+static sapi_post_entry mbstr_post_entries[] = {
+       { DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_mb_post_handler },
+       { MULTIPART_CONTENT_TYPE,    sizeof(MULTIPART_CONTENT_TYPE)-1,    NULL,                         rfc1867_post_handler },
+       { NULL, 0, NULL, NULL }
+};
+/* }}} */
+
 /* {{{ static int php_mb_parse_encoding_list()
  *  Return 0 if input contains any illegal encoding, otherwise 1.
  *  Even if any illegal encoding is detected the result may contain a list 
@@ -680,10 +696,13 @@ static PHP_INI_MH(OnUpdate_mbstring_encoding_translation)
 
        OnUpdateBool(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
 
-       if (MBSTRG(encoding_translation)){
-               _php_mb_enable_encoding_translation(1);
+       if (MBSTRG(encoding_translation)) {
+               sapi_unregister_post_entry(php_post_entries TSRMLS_CC);
+               sapi_register_post_entries(mbstr_post_entries TSRMLS_CC);
+               sapi_register_treat_data(mbstr_treat_data);
        } else {
-               _php_mb_enable_encoding_translation(0);
+               sapi_unregister_post_entry(mbstr_post_entries TSRMLS_CC);
+               sapi_register_post_entries(php_post_entries TSRMLS_CC);
        }
 
        return SUCCESS;
@@ -774,7 +793,8 @@ PHP_MINIT_FUNCTION(mbstring)
        REGISTER_INI_ENTRIES();
 
        if (MBSTRG(encoding_translation)) {
-               _php_mb_enable_encoding_translation(1);
+               sapi_register_post_entries(mbstr_post_entries TSRMLS_CC);
+               sapi_register_treat_data(mbstr_treat_data);
        }
 
        REGISTER_LONG_CONSTANT("MB_OVERLOAD_MAIL", MB_OVERLOAD_MAIL, CONST_CS | CONST_PERSISTENT);
@@ -809,10 +829,6 @@ PHP_MSHUTDOWN_FUNCTION(mbstring)
                free(MBSTRG(detect_order_list));
        }
 
-       if (MBSTRG(encoding_translation)) {
-               _php_mb_enable_encoding_translation(0);
-       }
-
 #if HAVE_MBREGEX
        PHP_MSHUTDOWN(mb_regex) (INIT_FUNC_ARGS_PASSTHRU);
 #endif
index a729eb5c4fa14a47aa472ab179fd89d302cfff32..c87d585883e1e7e15cff6839373883f31c5aff77 100644 (file)
@@ -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);
 }
 
 
index 11965fccf98054760173665c8e39e5af6512ac1f..ca6836a0cb472befc0789db02b20ba3c0c706e3a 100644 (file)
@@ -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));
index 66df88886401ccca6bc9bce4437ad73ce7100bcf..fd5283702de1a93da63033beddbf026f48efee19 100644 (file)
@@ -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);
index 3dfabf840adfc59ae56ac35c87dfae745b19f3b5..bf9ad54645672590dd5bf9cc07545b930230062b 100644 (file)
@@ -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);
index deab9271b16fd32883fcdebce90f978b7202a954..e04f6dc45db5a39fe88cc8aca892861ccca17955 100644 (file)
@@ -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 */