Author: rjung
Date: Sun Sep 30 15:17:48 2007
New Revision: 580800

URL: http://svn.apache.org/viewvc?rev=580800&view=rev
Log:
Clone server config in case a servers share their
config.
Because by default we (unfortunately)
don't inherit mounts between servers, a vhost with
no JK directive needs to become it's own server
config with an empty uw_map.
In this case Apache httpd itself will not call our
config create function and we need to clone the
config ourselves.
The old code simply overwrote uw_map with a new one
and the old one never got freed leading to a memory
leak of 8KB per vhost with no JK directoves.
Modified:
    tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c
    tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c

Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c?rev=580800&r1=580799&r2=580800&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c (original)
+++ tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c Sun Sep 30 15:17:48 
2007
@@ -2243,6 +2243,31 @@
 }
 
 
+/*
+ *  Clone jk config.
+ */
+static void *clone_jk_config(ap_pool * p, server_rec *s)
+{
+    jk_server_conf_t *src =
+        (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
+    jk_server_conf_t *dst =
+        (jk_server_conf_t *) ap_pcalloc(p, sizeof(jk_server_conf_t));
+
+    memcpy(dst, src, sizeof(jk_server_conf_t));
+    dst->was_initialized = JK_TRUE;
+    dst->s = s;
+    dst->mountcopy = 0;
+    dst->mount_file = NULL;
+    dst->alias_dir = NULL;
+    dst->uri_to_context = NULL;
+    if (!uri_worker_map_alloc(&(dst->uw_map), NULL, dst->log)) {
+        jk_error_exit(APLOG_MARK, APLOG_EMERG, s, p, "Memory error");
+    }
+
+    return dst;
+}
+
+
 static void copy_jk_map(ap_pool * p, server_rec * s, jk_map_t *src,
                         jk_map_t *dst)
 {
@@ -2486,7 +2511,11 @@
     for (; srv; srv = srv->next) {
         jk_server_conf_t *sconf = (jk_server_conf_t 
*)ap_get_module_config(srv->module_config,
                                                                            
&jk_module);
-        if (sconf && sconf->was_initialized == JK_FALSE) {
+        if (sconf && sconf->was_initialized == JK_TRUE) {
+            ap_set_module_config(srv->module_config, &jk_module,
+                                 clone_jk_config(p, srv));
+        }
+        else if (sconf && sconf->was_initialized == JK_FALSE) {
             sconf->was_initialized = JK_TRUE;
             open_jk_log(srv, p);
             sconf->options &= ~sconf->exclude_options;

Modified: tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c?rev=580800&r1=580799&r2=580800&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c (original)
+++ tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c Sun Sep 30 15:17:48 
2007
@@ -2358,6 +2358,31 @@
 }
 
 
+/** Clone jk config.
+ */
+static void *clone_jk_config(apr_pool_t * p, server_rec *s)
+{
+    jk_server_conf_t *src =
+        (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
+    jk_server_conf_t *dst =
+        (jk_server_conf_t *) apr_pcalloc(p, sizeof(jk_server_conf_t));
+
+    memcpy(dst, src, sizeof(jk_server_conf_t));
+    dst->was_initialized = JK_TRUE;
+    dst->s = s;
+    dst->mountcopy = 0;
+    dst->mount_file = NULL;
+    dst->alias_dir = NULL;
+    dst->uri_to_context = NULL;
+    if (!uri_worker_map_alloc(&(dst->uw_map), NULL, dst->log)) {
+        jk_error_exit(APLOG_MARK, APLOG_EMERG, s,
+                      s->process->pool, "Memory error");
+    }
+
+    return dst;
+}
+
+
 /** Utility - copy a map . XXX Should move to jk_map, it's generic code.
  */
 static void copy_jk_map(apr_pool_t * p, server_rec * s, jk_map_t *src,
@@ -2773,7 +2798,11 @@
             for (; srv; srv = srv->next) {
                 jk_server_conf_t *sconf = (jk_server_conf_t 
*)ap_get_module_config(srv->module_config,
                                                                                
    &jk_module);
-                if (sconf && sconf->was_initialized == JK_FALSE) {
+                if (sconf && sconf->was_initialized == JK_TRUE) {
+                    ap_set_module_config(srv->module_config, &jk_module,
+                                         clone_jk_config(pconf, srv));
+                }
+                else if (sconf && sconf->was_initialized == JK_FALSE) {
                     sconf->was_initialized = JK_TRUE;
                     if (open_jklog(srv, pconf))
                         return HTTP_INTERNAL_SERVER_ERROR;



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to