ID:               29915
 Updated by:       [EMAIL PROTECTED]
 Reported By:      test dot 007 at seznam dot cz
-Status:           Assigned
+Status:           Closed
 Bug Type:         Reproducible crash
 Operating System: *
 PHP Version:      4CVS, 5CVS (2005-03-09)
 Assigned To:      andi
 New Comment:

Fixed in CVS (picked Moriyoshi's approach to be on the safe side)


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

[2005-03-19 23:52:22] [EMAIL PROTECTED]


-       tsrm_mutex_unlock(tsmm_mutex);
 
        if (tsrm_new_thread_end_handler) {
                tsrm_new_thread_end_handler(thread_id,
&((*thread_resources_ptr)->storage));
        }
+       tsrm_mutex_unlock(tsmm_mutex);
 }

IMO simply putting the mutex release point ahead would 
make more sense..



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

[2005-03-19 22:38:19] [EMAIL PROTECTED]

Again a patch, can you review it or do I blindly commit it?


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

[2005-03-08 15:29:49] test dot 007 at seznam dot cz

--- TSRM/TSRM.c 2004-05-23 19:05:10.000000000 +0200
+++ TSRM/TSRM.c 2005-03-08 14:36:33.250000000 +0100
@@ -260,9 +260,11 @@
 static void allocate_new_resource(tsrm_tls_entry
**thread_resources_ptr, THREAD_T thread_id)
 {
        int i;
+       tsrm_tls_entry *new_resource;
 
        TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Creating data structures for
thread %x", thread_id));
        (*thread_resources_ptr) = (tsrm_tls_entry *)
malloc(sizeof(tsrm_tls_entry));
+       new_resource = (*thread_resources_ptr);
        (*thread_resources_ptr)->storage = (void **) malloc(sizeof(void
*)*id_count);
        (*thread_resources_ptr)->count = id_count;
        (*thread_resources_ptr)->thread_id = thread_id;
@@ -299,7 +301,7 @@
        tsrm_mutex_unlock(tsmm_mutex);
 
        if (tsrm_new_thread_end_handler) {
-               tsrm_new_thread_end_handler(thread_id,
&((*thread_resources_ptr)->storage));
+               tsrm_new_thread_end_handler(thread_id, 
&(new_resource->storage));
        }
 }
  
http://test-007.webpark.cz/php29915.u.patch

As I already explained, it may crash with any scripts, it only needs
many concurrent threads, thus I can't give you a good example script.

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

[2005-03-07 21:35:28] [EMAIL PROTECTED]

Please provide any patches in unified diff format (diff -u)
and also, put them online somewhere where we can download them. 

Can you also give some short example script which illustrates the
problem this patch supposedly fixes?


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

[2005-02-16 16:48:31] test dot 007 at seznam dot cz

Hello Tony,

I found the bug in 4.3.8, but I've checked sources of PHP5 (a link you
provided), and the bug is still present in both 4.x and 5.x.

The bug only occurs if there are more PHP threads running, and you have
a bad luck. It is unrelated to a PHP script, it can crash with any
script(s) => I can't provide you with a particular "crashing" or even
"crashes here" script.

To sum up the problem, allocate_new_resource() uses a resource a
microsecond after it has unlocked a mutex. If another thread removes
the resource during the microsecond, crash.

tsrm_mutex_unlock(tsmm_mutex);
if (tsrm_new_thread_end_handler) {
                tsrm_new_thread_end_handler(thread_id,
&((*thread_resources_ptr)->storage));

My patch is obviously harmless, and, believe me, it helps :-)

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

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/29915

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

Reply via email to