ID:               28568
 User updated by:  novicky at aarongroup dot cz
 Reported By:      novicky at aarongroup dot cz
 Status:           Bogus
 Bug Type:         Reproducible crash
 Operating System: win32
 PHP Version:      4.3.7RC1
 New Comment:

It does change at least in MBSTRING module where post handlers are
being registered.
We have debugged crash of PHP as IIS isapi module and there was a
problem with different threads manipulates the same memory of
known_post_content_types.


Previous Comments:
------------------------------------------------------------------------

[2004-05-30 19:47:30] [EMAIL PROTECTED]

It is safe because it does not actually change. 

------------------------------------------------------------------------

[2004-05-29 15:07:41] novicky at aarongroup dot cz

Description:
------------
Variable known_post_content_types used in SAPI.c is declared as static
which is not thread safe and can lead to crash under multithread
webservers like IIS.

Here is a patch for SAPI.h and SAPI.c

--- php-4.3.7RC1.orig/main/SAPI.h       2003-04-09 22:27:55.000000000 +0200
+++ php-4.3.7RC1/main/SAPI.h    2004-05-26 10:08:34.000000000 +0200
@@ -120,6 +120,7 @@
        long post_max_size;
        int options;
        zend_bool sapi_started;
+       HashTable known_post_content_types;
 } sapi_globals_struct;



--- php-4.3.7RC1.orig/main/SAPI.c       2004-03-27 02:45:44.000000000 +0100
+++ php-4.3.7RC1/main/SAPI.c    2004-05-29 14:34:47.000000000 +0200
@@ -48,7 +48,6 @@
 
 #include "php_content_types.h"
 
-static HashTable known_post_content_types;
 
 #ifdef ZTS
 SAPI_API int sapi_globals_id;
@@ -59,6 +58,11 @@
 static void sapi_globals_ctor(sapi_globals_struct *sapi_globals
TSRMLS_DC)
 {
        memset(sapi_globals, 0, sizeof(*sapi_globals));
+       zend_hash_init_ex(&SG(known_post_content_types), 5, NULL, NULL, 1,
0);
+}
+
+static void sapi_globals_dtor(sapi_globals_struct *sapi_globals
TSRMLS_DC) {
+       zend_hash_destroy(&SG(known_post_content_types));
 }
 
 /* True globals (no need for thread safety) */
@@ -68,10 +72,9 @@
 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
        sapi_globals_ctor(&sapi_globals TSRMLS_CC);
 #endif
@@ -98,7 +101,6 @@
        tsrm_win32_shutdown();
 #endif
 
-       zend_hash_destroy(&known_post_content_types);
 }
 
 
@@ -151,7 +153,7 @@
        }
 
        /* 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;
@@ -795,12 +797,14 @@
 
 SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry)
 {
-       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);
+       TSRMLS_FETCH();
+       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)
 {
-       zend_hash_del(&known_post_content_types, post_entry->content_type,
post_entry->content_type_len+1);
+       TSRMLS_FETCH();
+       zend_hash_del(&SG(known_post_content_types),
post_entry->content_type, post_entry->content_type_len+1);
 }
 





------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=28568&edit=1

Reply via email to