]> granicus.if.org Git - apache/commitdiff
Merge r1374874 from trunk:
authorJim Jagielski <jim@apache.org>
Wed, 28 Nov 2012 16:33:18 +0000 (16:33 +0000)
committerJim Jagielski <jim@apache.org>
Wed, 28 Nov 2012 16:33:18 +0000 (16:33 +0000)
WinNT MPM: Fix thread-safety issue in worker_main().  All
workers were allocating from pchild without holding '
child_lock.  Allocate from ptrans instead.

Related to: PR 52196

The reporter suggests that the apr_thread_t for r->connection->current_thread
should have a unique pool.  This revision handles that for WinNT MPM,
but not for other MPMs.

Submitted by: trawick
Reviewed/backported by: jim

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1414796 13f79535-47bb-0310-9956-ffa450edef68

STATUS
server/mpm/winnt/child.c

diff --git a/STATUS b/STATUS
index 50492080a1c9f07cd824c5ec028f1b65723f3694..2a0c2cf58685852062a3606e159f7adfd1f81c54 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -89,10 +89,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-   * WinNT MPM thread-safety issue at child startup
-     trunk patch: http://svn.apache.org/viewvc?view=revision&sortby=date&revision=1374874
-     2.4.x patch: trunk patch works
-     +1: trawick, gsmith, covener
 
 
 PATCHES PROPOSED TO BACKPORT FROM TRUNK:
index ae34b07bb60d3c3b1e8be419ec4957238b9385cd..7983851a86ab32e71735fa76a7d53981dbf12269 100644 (file)
@@ -761,7 +761,7 @@ apr_status_t winnt_insert_network_bucket(conn_rec *c,
  */
 static DWORD __stdcall worker_main(void *thread_num_val)
 {
-    apr_thread_t *thd = NULL;
+    apr_thread_t *thd;
     apr_os_thread_t osthd;
     static int requests_this_child = 0;
     winnt_conn_ctx_t *context = NULL;
@@ -773,7 +773,6 @@ static DWORD __stdcall worker_main(void *thread_num_val)
     apr_int32_t disconnected;
 
     osthd = apr_os_thread_current();
-    apr_os_thread_put(&thd, &osthd, pchild);
 
     while (1) {
 
@@ -811,6 +810,8 @@ static DWORD __stdcall worker_main(void *thread_num_val)
             continue;
         }
 
+        thd = NULL;
+        apr_os_thread_put(&thd, &osthd, context->ptrans);
         c->current_thread = thd;
 
         /* follow ap_process_connection(c, context->sock) logic