While shutting down apache on a windows server with debug libraries,  the 
underlying os libraries were complaining about the double free of a block of 
memory.   
 
  It appears that when ap_proxy_add_worker_to_balancer(apr_pool_t *pool, 
proxy_balancer *balancer, proxy_worker *worker) is called it uses memcpy to 
duplicate the proxy worker but doesn't do anything to change the cleanup 
routines or to make it's own copy of allocated resources like the pool and 
possibly the semaphore.  This results in two proxy workers structures each 
pointing to the same pool and semaphore.  
 
  During cleanup the original worker and the balancer worker each free their 
pool (which is the same pool), resulting in the pool being placed in the pool 
free list twice, now when the memory is freed there will be a double free of 
the memory representing the pool.
 
My patch for the issue is attached.
 
 
Duane
Index: proxy_util.c
===================================================================
--- proxy_util.c        (revision 767999)
+++ proxy_util.c        (working copy)
@@ -1473,6 +1473,18 @@
     /* Increase the total runtime count */
     proxy_lb_workers++;
 
+       // get our own copies of alloced resources
+       init_conn_pool(pool, runtime);
+
+#if APR_HAS_THREADS
+   if (apr_thread_mutex_create(&(runtime->mutex),
+                APR_THREAD_MUTEX_DEFAULT, pool) != APR_SUCCESS) {
+        ap_log_perror(APLOG_MARK, APLOG_ERR, 0, pool,
+                "proxy failed to create mutex for balancer worker");
+      
+    }
+#endif
+
 }
 
 PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker,

Reply via email to